我有一个(非常)小的 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));
没有做到这一点。
任何线索?
答案 0 :(得分:1)
简而言之:您正在阻止事件循环,这就是未触发超时的原因。
由于它是反应性的,你不应该阻止事件循环。如果handleGenerateCombinations
需要更多时间,那么您应该使用WorkerVerticle。使用WorkerVerticle,如果持续时间超过3秒,您将获得超时。