WebClient上的exchange()可以引发哪些异常?

时间:2019-04-10 10:53:25

标签: reactor-netty spring-webclient

我已经实现了一项服务,该服务可使ReST调用其他服务来实现其部分功能。我为此使用反应式WebClient,例如:

webClient.post()
    .uri(....)
    .contentType(....)
    .accept(....)
    .header(....)
    .syncBody(someRequestObject)
    .exchange()
    .flatMap(someResponseHandler::handleResponse)
    .doOnError(throwable -> {
        // do interesting things depending on throwable
    })
    .retry(1, this::somePredicateDependingOnThrowable);

现在...我在someResponseHandler::handleResponse中处理HTTP状态,但我真正想知道的是,exchange()会遇到哪些 other 种异常/错误? -即

  • 如果根本无法连接到下游服务,我会得到什么异常/错误?
  • 如果连接尝试超时,我会得到什么异常/错误?
  • 如果我可以连接但在获得响应之前请求超时,我会得到什么异常/错误?

显然,这些都不是HTTP状态代码-但是我找不到任何文档可以告诉我要寻找的内容。我只是在找对地方吗?我浏览了反应式WebClient的文档,也浏览了《 Reactor Netty参考指南》,但是没有运气。

对于背景来说,这很重要,因为我们进行基于HATEOAS的服务发现-对于其中某些异常,我想触发重新发现,对于其中某些异常,我不希望。

1 个答案:

答案 0 :(得分:0)

我建议测试使用WebClient的代码,看看它如何处理您提到的各种情况。您可以从单元测试中轻松针对MockWebServer之类的代码进行测试。 MockWebServer可以模拟此处提到的大多数错误。

话虽如此,这就是在将WebClientReactorClientHttpConnector结合使用时在测试中看到的内容。其他连接器可能会抛出稍有不同的异常,但可能会在异常类层次结构中共享一个超类,如下所述。

未知主机

java.net.UnknownHostException

连接被拒绝(服务器上的端口未打开)

java.net.ConnectException(或子类)

反应堆净值抛出io.netty.channel.AbstractChannel$AnnotatedConnectException

连接超时

如果您有configured a connect timeout,那么您将收到java.net.ConnectException(或子类)

反应堆净值抛出io.netty.channel.ConnectTimeoutException

SSL握手错误

javax.net.ssl.SSLHandshakeException(或子类)

请求正文编码错误

这随所使用的编码器而异,但通常为org.springframework.core.codec.EncodingException(或子类)

如果编码配置不正确,某些编码器也会抛出java.lang.IllegalStateException

响应主体解码错误

这因所使用的解码器而异,但通常为org.springframework.core.codec.DecodingException(或子类)

如果解码器配置不正确,某些解码器也会抛出java.lang.IllegalStateException

读取超时

如果使用反应堆网络,并且您配置了io.netty.handler.timeout.ReadTimeoutHandler,然后配置了io.netty.handler.timeout.ReadTimeoutException

如果您在反应式流调用链中的某处使用.timeout运算符,那么java.util.concurrent.TimeoutException

写入超时

如果使用反应堆网络,并且您配置了io.netty.handler.timeout.WriteTimeoutHandler,然后配置了io.netty.handler.timeout.WriteTimeoutException

服务器过早关闭了连接(在响应完成之前)

java.io.IOException(或子类)

反应堆净值抛出reactor.netty.http.client.PrematureCloseException

其他

someResponseHandler::handleResponse

期间发生的任何异常