【发布时间】:2018-08-18 20:21:13
【问题描述】:
我正在使用 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 元素应该被忽略。
用RestTemplate 回到spring-web,我记得连接超时也导致RestClientException。所以我们可以捕获所有异常和超时的RestClientException。有没有办法我们也可以使用WebClient 来做到这一点?
【问题讨论】:
-
我试过你的代码,但如果我返回
Mono.empty(),我会得到一个NullPointerException。这真的对你有用吗?文档说您必须抛出异常而不是返回Mono.empty()。
标签: spring-webflux reactor-netty