我已经开始学习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
});