在 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 秒,您将超时。
我有一个(非常)小的 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 秒,您将超时。