Spring WebFlux 网络客户端处理 ConnectTimeoutException

Spring WebFlux webclient handle 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 方法为每个 400 / 500 响应代码返回一个空的 Mono。我怎样才能为连接超时做同样的事情,甚至读/写超时。因为现在它只是抛出一个 io.netty.channel.ConnectTimeoutException 没有被 onStatus

处理

我的控制器上不需要 @ExceptionHandler,因为这些 REST 调用是更复杂流程的一部分,并且通过一个空 Mono 元素应该被忽略。

回到 spring-web RestTemplate,我记得连接超时也导致了 RestClientException。所以我们可以捕获所有异常和超时的 RestClientException 。有没有办法我们也可以用 WebClient 做到这一点?

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);