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
奇怪......我認爲暫停是真正的「超時」,無論正在進行的操作(或非常接近)。我會測試它,並接受你的答案,如果這是問題...我不知道阻止事件循環不會觸發任何超時已經設置 –