2015-12-27 57 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

奇怪......我认为暂停是真正的“超时”,无论正在进行的操作(或非常接近)。我会测试它,并接受你的答案,如果这是问题...我不知道阻止事件循环不会触发任何超时已经设置 –

相关问题