我使用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
执行此操作?
答案 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);