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

标签 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));没有达到目的。

有什么线索吗?

最佳答案

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

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

关于java - 在 Vert.x 路由器中设置超时 "globally"(适用于所有操作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34483476/

相关文章:

java - 将 WAVE PCM 字节数组传递给 FFT 以进行音调检测

java - Android Mediaplayer Streaming - 现在工作但没有

Java 可重入锁和条件 |生产者完成工作,消费者陷入困境

java - onSuccess/onFailure 可以替代 vert.x 中 CompositeFuture 的 setHandler 吗?

java - vertx 调用后搜索域查询失败

hazelcast - Vert.X 与 Hazelcast

java - 在 java 中添加对象名称开头并设置文本

java - Spring Webflux : Extract a value from a Mono and save it into another variable

java - Vertx.io 应用程序的单元测试

java - 为什么我们不能在 Java 中使用指针?