对同一端点的并行请求被阻止

时间:2018-02-09 05:49:51

标签: java vert.x

我已经开始学习vertx并使用vertx-web添加端点。我已经定义了我的Verticle并从该Verticle启动了我的HttpServer,如下所示

public class Bootloader {

 public static void main(String[] args) {
   Vertx vertx = Vertx.vertx();
   vertx.deployVerticle(WebVerticle.class.getName());
 }

}

public class WebVerticle extends AbstractVerticle {
 private static final Logger LOGGER = LoggerFactory.getLogger(WebVerticle.class);

   @Override
   public void start(Future<Void> startFuture) throws Exception {
     HttpServer httpServer = vertx.createHttpServer();
     httpServer.requestHandler(getRouter(vertx)::accept).listen(8080);
     LOGGER.info("WebVerticle deployed");
   }

   private Router getRouter(Vertx vertx) {
     Router router = Router.router(vertx);
     registerHandlers(router);
     return router;
   }

   private void registerHandlers(Router router) {

     router.route("/foo").blockingHandler(routingContext -> {
     LOGGER.info("For request having path: /foo");
     LOGGER.info("routingContext = [" + routingContext + "]");
     LOGGER.info("thread = [" + Thread.currentThread().getName() + "]");
     try {
        Thread.currentThread().sleep(10000);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }
     routingContext.response().end("BAR");
     }, false);

   }

}

当我从不同的标签调用/ foo端点时,我看到请求处理按顺序发生。我错过了vetx concetps中的一些东西,我应该理解为扩展我的webapp。请指导我做错的地方和解决方法。

1 个答案:

答案 0 :(得分:0)

请求在事件循环线程上执行。在没有任何其他参数的情况下部署Verticle时,一个实例将部署在一个事件循环线程上。

当您调用

 try {
    Thread.currentThread().sleep(10000);
 } catch (InterruptedException e) {
   e.printStackTrace();
 }

根据您的请求,您阻止此一个事件循环10秒,在此期间它无法处理任何其他请求,因此请勿执行此操作:)

如果您想延迟回复,请使用

vertx.setTimer(10000, l -> {
        //no finish your response
    });