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);
我正在使用 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);