Как говорилось о проблеме Spring Framework, которую вы открыли (спасибо за это!), Это не похоже на ошибку в Framework.
Путаница возникает из-затот факт, что при одновременном выполнении нескольких запросов веб-клиента и добавлении оператора log
в реактивный конвейер для получения дополнительной информации журналы заставляют вас думать, что тайм-аут чтения срабатывает, даже если запрос только что был выполнен.
Если я правильно помню, номер суффикса, который вы видите в журналах, например reactor.Mono.SwitchIfEmpty.48759
, привязан к подписчику.
В вашем случае это означает, что
13:55:50.287 [reactor-http-nio-6] INFO reactor.Mono.MapFuseable.49127 - | request(unbounded)
и
13:55:50.312 [reactor-http-nio-6] ERROR reactor.Mono.SwitchIfEmpty.48759 - onError(
- это не одни и те же HTTP-запросы.Reactor планирует задачи в рабочих потоках, поэтому, когда вы видите, что в одном потоке последовательно происходят события, это не означает, что эти единицы работы выполняются для одного и того же подписчика.
Если вы следуете подписчикуid в журналах, вы должны увидеть, что промежуток времени между запросом данных и не получением составляет около 5 секунд.
Не в этой последней точке, я создал сервер HTTP Reactor, который отправляет тело ответачерез 10 секунд:
HttpServer.create().host("localhost").port(8080).handle((req, res) -> {
return res.sendString(Flux.just("Hello")
.delayElements(Duration.ofSeconds(10)), StandardCharsets.UTF_8);
}).bindNow().onDispose().block();
И WebClient, который извлекает эти данные:
String response = WebClient.create().get().uri("http://localhost:8080/")
.retrieve().bodyToMono(String.class).log().block();
System.out.println(response);
Я не получаю тайм-аут чтения.Поэтому в вашем приложении должно быть настроено такое время ожидания.