Spring WebFlux webclient处理ConnectTimeoutException

时间:2018-03-10 09:52:24

标签: spring-webflux reactor-netty

我使用Spring WebFlux webclient进行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 个答案:

答案 0 :(得分:2)

Reactor为此提供了多个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);