#java #vert.x
#java #vert.x
Вопрос:
Я пытаюсь настроить requestTimeout в веб-клиенте vert.x. Но это работает не так, как ожидалось.
api со временем отклика < 10 мс истекает из webclient с установленным временем ожидания запроса 100 мс. И сервер, и клиент запущены на моем локальном компьютере.
@Test
public void connectionTimeOut() throws InterruptedException {
WebClient client = WebClient.create(Vertx.vertx());
client.request(HttpMethod.GET,8000 , "localhost", "/scripts/").timeout(100).send(ar -> {
if (ar.succeeded()) {
System.out.print("Request succeded");
} else {
ar.cause().printStackTrace(); ;
}
});
TimeUnit.MINUTES.sleep(20);
}
java.util.concurrent.TimeoutException: The timeout period of 100ms has been exceeded while executing GET /scripts/ for host localhost
at io.vertx.core.http.impl.HttpClientRequestBase.timeout(HttpClientRequestBase.java:183)
at io.vertx.core.http.impl.HttpClientRequestBase.handleTimeout(HttpClientRequestBase.java:168)
at io.vertx.core.http.impl.HttpClientRequestBase.lambda$setTimeout$0(HttpClientRequestBase.java:126)
at io.vertx.core.impl.VertxImpl$InternalTimerHandler.handle(VertxImpl.java:870)
at io.vertx.core.impl.VertxImpl$InternalTimerHandler.handle(VertxImpl.java:829)
at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:344)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Тот же код работает, если я установлю requestTimeout равным 1000 мс. Пожалуйста, дайте мне знать, есть ли какой-либо обходной путь для этого или если я чего-то не хватает.
Комментарии:
1. Вы работаете в режиме отладки?
2. Нет. Я выполнил это как тестовый пример junit.
3. Я бы предложил использовать платформу модульного тестирования vert.x и использовать их методы для тестирования вашего кода здесь приведены более подробные сведения о работе с ней и JUnit. Затем вы можете протестировать асинхронный код более естественным способом, используя его. Возможно, вы захотите также использовать объект Async при тестировании этого способа.
4. ДА. Согласен, это лучший способ протестировать код vertex. Но я не думаю, что это повлияет на requestTimeout в webclient.
5. Можете ли вы убедиться с помощью Wireshark, что серверная часть действительно отвечает?