2015-12-27 1 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' - это просто метод, который вызывает (асинхронно)« Версию рабочего »с указанным тайм-аутом для этого вызова ... но я хочу установить тайм-аут для каждого HTTP-запроса, независимо от операции –

+0

Вы установили таймаут правильно, он просто не будет работать, если цикл события заблокирован. – cy3er

+0

Странно ... Я думал, что тайм-аут - это «тайм-аут» по-настоящему, независимо от текущей операции (или очень близко к ней). Я проверю его и приму ваш ответ, если это проблема ... Я не знал, что блокировка цикла события не вызовет какого-либо тайм-аута, уже установленного –

Смежные вопросы