【问题标题】:Spring WebFlux webclient handle ConnectTimeoutExceptionSpring WebFlux webclient 处理 ConnectTimeoutException
【发布时间】: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.ConnectTimeoutExceptiononStatus 没有处理它

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

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

【问题讨论】:

  • 我试过你的代码,但如果我返回Mono.empty(),我会得到一个NullPointerException。这真的对你有用吗?文档说您必须抛出异常而不是返回Mono.empty()

标签: spring-webflux reactor-netty


【解决方案1】:

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

【讨论】:

  • 为什么不返回 Mono.error() 而不是 Mono.empty() ?
  • 那是 OP 当时问的。
猜你喜欢
  • 2021-08-06
  • 2019-12-04
  • 2021-08-13
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2017-12-31
  • 2019-12-28
相关资源
最近更新 更多