Spring WebFlux обрабатывает веб-клиента ConnectTimeoutException

Я использую веб-клиент Spring WebFlux для выполнения вызовов REST. Я настроил тайм-аут соединения на 3000 миллисекунды соответственно:

WebClient webClient = WebClient.builder()
    .clientConnector(new ReactorClientHttpConnector(options -> options
        .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)))
    .build();

return webClient.get()
    .uri("http://localhost:8081/resource")
    .retrieve()
    .onStatus(HttpStatus::isError, clientResponse -> {
        // Some logging..
        return Mono.empty();
    })
    .bodyToMono(MyPojo.class);

onStatus метод возвращает пустое Mono для каждого 400 / 500 код ответа. Как я могу сделать то же самое для тайм-аута соединения и, возможно, даже таймаутов чтения / записи. Как сейчас его просто бросает io.netty.channel.ConnectTimeoutException который не обрабатывается onStatus

Мне не нужен @ExceptionHandler на моем контроллере, так как эти вызовы REST являются частью более сложного потока, и через пустой Mono элемент должен быть просто проигнорирован.

Вернуться в spring-web с RestTemplateЯ помню, тайм-аут подключения также привел к RestClientException, Таким образом, мы могли бы просто поймать RestClientException для всех исключений и тайм-аутов. Есть ли способ, которым мы можем сделать это с WebClient также?

1 ответ

Решение

Реактор предлагает несколько onError*** операторы для этого:

return webClient.get()
    .uri("http://localhost:8081/resource")
    .retrieve()
    .onErrorResume(ex -> Mono.empty())
    .onStatus(HttpStatus::isError, clientResponse -> {
        // Some logging..
        return Mono.empty();
    })
    .bodyToMono(MyPojo.class);
Другие вопросы по тегам