我已经开始学习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。请指导我做错的地方和解决方法。
答案 0 :(得分:0)
请求在事件循环线程上执行。在没有任何其他参数的情况下部署Verticle时,一个实例将部署在一个事件循环线程上。
当您调用
时 try {
Thread.currentThread().sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
根据您的请求,您阻止此一个事件循环10秒,在此期间它无法处理任何其他请求,因此请勿执行此操作:)
如果您想延迟回复,请使用
vertx.setTimer(10000, l -> {
//no finish your response
});