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



我已经开始学习vertx并使用vertx-web添加端点。我已经定义了我的垂直并从那个垂直启动我的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。请指导我在哪里做错了什么。

该请求是在事件环线程上执行的。当您没有任何其他参数时部署垂直时,一个实例将在一个事件循环线程上部署。

当您调用

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

根据您的要求,您将此一个事件循环封锁10秒钟,在此期间无法处理任何其他请求,所以不要这样做:(

当您要延迟响应时,请使用

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

最新更新