我希望能够为使用Spring 5 WebClient(Spring Boot版本2.0.0.RELEASE)发出的请求设置超时值。我的第一次尝试是按照这个答案的建议配置WebClient:Spring 5 webflux how to set a timeout on Webclient。如果服务器没有及时响应,则会正确超时。但这也有其他含义:在WebClient成功发出响应之后(在.retrive()
或.exchange()
之后)定时器继续运行,这样如果达到超时值然后引发超时异常。
似乎这是预期的行为,因为在配置的时间段过去之后ReadTimeoutHandler超时并且netty通道没有读取任何数据(忽略先前读取的数据)。 换句话说:您使用WebClient调用外部http服务(已配置ReadTimeoutHandler),然后工作处理程序执行一些可能比超时值花费更多时间的工作,因此.... io.netty.handler.timeout.ReadTimeoutException是抛出。
所以...到我的问题:如何正确地为每个使用WebClient进行的http调用设置每个客户端请求超时?我有一种可能的方法:在每个webClient调用之上链接timeout
Mono
方法。我想知道在最终的服务中断情况下是否会导致某种资源泄漏。还有其他选择吗?
提前致谢!!!
答案 0 :(得分:1)
问题的这一部分还不清楚。
如果服务器未及时响应,则此超时正确。但这还具有其他含义:在WebClient成功发出响应之后(.retrive()或.exchange()之后),计时器继续运行,这样,如果达到超时值,则会引发超时异常。 >
在Reactor Netty级别,您可以配置以下几项:
看着您的问题,似乎您在指出流场景(服务器可以在事件发生时发送事件)会触发此超时。我同意这一点。
有两种解决方案:
timeout
运算符附加到您的反应链中。万一发生超时或错误,所有处理池资源的Spring WebFlux操作都将清理这些资源以避免泄漏。如果您手动处理在没有代码手动调用的情况下无法进行GC的资源,则您当然要为此承担责任