0
我有一个(非常)小的Vert.x 3.x应用程序。从来没有在Vert.x路由器中设置“全局”超时(所有操作)
public class ServerVerticle extends AbstractVerticle {
private void bootstrap(Handler<AsyncResult<HttpServer>> next) {
final Router router = Router.router(vertx);
router.route().handler(TimeoutHandler.create(3000)); // 3 seconds
router.route().handler(BodyHandler.create());
// [start] REST API
router.get("/api/v1/phones/:number").handler(/*this::handleGenerateCombinations*/);
// [end] REST API
router.route().handler(StaticHandler.create());
vertx.createHttpServer()
.requestHandler(router::accept)
.listen(config().getInteger("http.port", 9080), next::handle);
}
private void done(AsyncResult<HttpServer> http, Future<Void> future) {
if (http.succeeded()) {
future.complete();
} else {
future.fail(http.cause());
}
}
@Override
public void start(Future<Void> future) {
bootstrap(http -> done(http, future));
}
@Override
public void stop() throws Exception {
// ...
}
}
...但每当我执行handleGenerateCombinations
方法(我做它采取超过3秒,cpmplete)它:我想在一个路由器设置超时为所有航线倍出,但报告中的控制台:
Dec 27, 2015 io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-eventloop-thread-1,5,main] has been blocked for 3167 ms, time limit is 2000
Dec 27, 2015 io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-eventloop-thread-1,5,main] has been blocked for 5952 ms, time limit is 2000
io.vertx.core.VertxException: Thread blocked
. . .
我不知道在那两个秒着落,但我认为router.route().handler(TimeoutHandler.create(3000));
没有做的伎俩。
任何线索?
不管操作如何,我都希望超时,并且在HTTP“服务器”中使它有意义。它必须可以在某处配置。 'handleGenerateCombinations'只是一个方法,它调用(异步)一个具有指定超时的“Worker Verticle”,同时......但我想为每个HTTP请求设置一个超时值,而不管操作如何设置 –
您设置了正确的超时,如果事件循环被阻塞,它将不起作用。 – cy3er
奇怪......我认为暂停是真正的“超时”,无论正在进行的操作(或非常接近)。我会测试它,并接受你的答案,如果这是问题...我不知道阻止事件循环不会触发任何超时已经设置 –