У меня есть (очень) маленькое Vert.x 3.x приложение. Я пытаюсь установить тайм-аут для всех маршрутов в одном маршрутизаторе:Установите тайм-аут «глобально» (для всех операций) в маршрутизаторе Vert.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 секунд, чтобы cpmplete) это никогда раз-аут, но отчет в консоли:
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));
не делает трюк.
Любые подсказки?
Я хочу тайм-аут независимо от операции, и имеет смысл иметь его там, на HTTP-сервере; он должен быть где-то настраиваться. 'handleGenerateCombinations' - это просто метод, который вызывает (асинхронно)« Версию рабочего »с указанным тайм-аутом для этого вызова ... но я хочу установить тайм-аут для каждого HTTP-запроса, независимо от операции –
Вы установили таймаут правильно, он просто не будет работать, если цикл события заблокирован. – cy3er
Странно ... Я думал, что тайм-аут - это «тайм-аут» по-настоящему, независимо от текущей операции (или очень близко к ней). Я проверю его и приму ваш ответ, если это проблема ... Я не знал, что блокировка цикла события не вызовет какого-либо тайм-аута, уже установленного –