2015-12-27 56 views
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));沒有做的伎倆。

任何線索?

回答

1

簡而言之:您正在阻止事件循環,這就是爲什麼沒有觸發超時。

由於它是被動的,你不應該阻止事件循環。如果handleGenerateCombinations需要更多時間,那麼您應該使用WorkerVerticle。使用WorkerVerticle如果持續時間超過3秒,您將會收到超時。

+0

不管操作如何,我都希望超時,並且在HTTP「服務器」中使它有意義。它必須可以在某處配置。 'handleGenerateCombinations'只是一個方法,它調用(異步)一個具有指定超時的「Worker Verticle」,同時......但我想爲每個HTTP請求設置一個超時值,而不管操作如何設置 –

+0

您設置了正確的超時,如果事件循環被阻塞,它將不起作用。 – cy3er

+0

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

相關問題