Springboot Webclient генерирует ошибки readtimeout - PullRequest
0 голосов
/ 14 декабря 2018

Spring Webclient генерирует много таймаутов чтения (при загрузке 1000 запросов в секунду).Я использую Springboot версии 2.1.1.Пожалуйста, найдите код ниже, и если мне не хватает какой-либо конфигурации, дайте мне знать:

@Bean
public WebClient webClient() {
    return WebClient.builder().build();
}

public Mono<String> post(String url, JSONObject body) {

    Mono<String> result = webClient.post().uri(url)
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON_UTF8)
            .body(BodyInserters.fromObject(body))
            .exchange()
            .flatMap { clientResponse ->
        return handleResponse(clientResponse)
    }
    return result;
}

private Mono<String> handleResponse(ClientResponse clientResponse) {
         if (clientResponse.statusCode().is4xxClientError() || clientResponse.statusCode().is5xxServerError()) {
            return clientResponse.bodyToMono(String.class)
                    .flatMap { errorBody ->
                return Mono.error(new CustomException(errorBody, clientResponse.statusCode().value()))
            }
        } else {
            return clientResponse.bodyToMono(String.class);
        }
    }

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Как говорилось о проблеме 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);

Я не получаю тайм-аут чтения.Поэтому в вашем приложении должно быть настроено такое время ожидания.

0 голосов
/ 14 декабря 2018

Можете ли вы проверить, что для ресурса, к которому вы пытаетесь получить доступ, регулирование не включено.Извините, у меня недостаточно репутации, чтобы комментировать.

...