在Vert.x路由器中设置“全局”超时(对于所有操作)

时间:2015-12-27 18:27:18

标签: java vert.x

我有一个(非常)小的 Vert.x 3.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秒才能完成),它永远不会超时但在控制台中报告:

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 个答案:

答案 0 :(得分:1)

简而言之:您正在阻止事件循环,这就是未触发超时的原因。

由于它是反应性的,你不应该阻止事件循环。如果handleGenerateCombinations需要更多时间,那么您应该使用WorkerVerticle。使用WorkerVerticle,如果持续时间超过3秒,您将获得超时。