WebClient 上的 Exchange() 会抛出哪些异常?

And*_*dyB 2 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);
Run Code Online (Sandbox Code Playgroud)

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

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

显然,这些都不是 HTTP 状态代码 - 但我找不到任何文档来告诉我可以查找什么。我只是没有找对地方吗?我浏览了反应式 WebClient 的文档,也浏览了 Reactor Netty 参考指南,但没有成功。

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

Phi*_*lay 5

我建议测试使用的代码,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