1

我已经实现了一项服务,它使 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);

现在...我在 中处理 HTTP 状态someResponseHandler::handleResponse,但我真正想知道的是,还有哪些其他类型的异常/错误可以从exchange()- 即

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

显然,这些都不是 HTTP 状态代码 - 但我找不到任何文档来告诉我可以查找的内容。我只是没有找对地方吗?我查看了响应式 WebClient 的文档,并查看了 Reactor Netty 参考指南,但没有运气。

作为背景,这很重要,因为我们进行基于 HATEOAS 的服务发现——对于其中一些异常,我想触发重新发现,对于其中一些,我不这样做。

4

1 回答 1

2

我建议测试你的代码,WebClient看看它如何处理你提到的各种场景。MockWebServer您可以通过单元测试轻松地测试您的代码。MockWebServer可以模拟这里提到的大部分错误。

话虽如此,这就是我在WebClient使用ReactorClientHttpConnector. 其他连接器可能会抛出略有不同的异常,但可能会在异常类层次结构中共享一个超类,如下所述。

未知主机

java.net.UnknownHostException

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

java.net.ConnectException(或子类)

反应堆网络抛出io.netty.channel.AbstractChannel$AnnotatedConnectException

连接超时

如果您配置了连接超时,那么您将收到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如果解码配置不正确,一些解码器也会抛出

读取超时

如果使用 reactor-netty,并且您配置了一个io.netty.handler.timeout.ReadTimeoutHandler,那么io.netty.handler.timeout.ReadTimeoutException

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

写超时

如果使用 reactor-netty,并且您配置了一个io.netty.handler.timeout.WriteTimeoutHandler,那么io.netty.handler.timeout.WriteTimeoutException

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

java.io.IOException(或子类)

反应堆网络抛出reactor.netty.http.client.PrematureCloseException

其他

期间发生的任何异常someResponseHandler::handleResponse

于 2019-04-21T00:35:00.393 回答