在 Vert.x 路由器中设置超时 "globally"(对于所有操作)

Set timeout "globally" (for all operations) in Vert.x router

我有一个(非常)小的 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)); 没有成功。

有什么线索吗?

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

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