我已经实现了一项服务,该服务可使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的服务发现-对于其中某些异常,我想触发重新发现,对于其中某些异常,我不希望。
答案 0 :(得分:0)
我建议测试使用WebClient
的代码,看看它如何处理您提到的各种情况。您可以从单元测试中轻松针对MockWebServer
之类的代码进行测试。 MockWebServer
可以模拟此处提到的大多数错误。
话虽如此,这就是在将WebClient
与ReactorClientHttpConnector
结合使用时在测试中看到的内容。其他连接器可能会抛出稍有不同的异常,但可能会在异常类层次结构中共享一个超类,如下所述。
java.net.UnknownHostException
java.net.ConnectException
(或子类)
反应堆净值抛出io.netty.channel.AbstractChannel$AnnotatedConnectException
如果您有configured a connect timeout,那么您将收到java.net.ConnectException
(或子类)
反应堆净值抛出io.netty.channel.ConnectTimeoutException
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