正确设置Spring 5 WebClient的请求超时

时间:2018-04-03 17:09:42

标签: spring-boot spring-webflux

我希望能够为使用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方法。我想知道在最终的服务中断情况下是否会导致某种资源泄漏。还有其他选择吗?

提前致谢!!!

1 个答案:

答案 0 :(得分:1)

问题的这一部分还不清楚。

  

如果服务器未及时响应,则此超时正确。但这还具有其他含义:在WebClient成功发出响应之后(.retrive()或.exchange()之后),计时器继续运行,这样,如果达到超时值,则会引发超时异常。 >

在Reactor Netty级别,您可以配置以下几项:

  • 连接超时,即客户端与服务器建立连接所花费的最长时间
  • 读取超时,客户端在没有收到来自服务器的任何数据并且响应不完整的情况下应等待的最长时间

看着您的问题,似乎您在指出流场景(服务器可以在事件发生时发送事件)会触发此超时。我同意这一点。

有两种解决方案:

  1. 您为流传输方案配置了单独的连接器实例,因此不会遇到此问题
  2. 您可以将timeout运算符附加到您的反应链中。万一发生超时或错误,所有处理池资源的Spring WebFlux操作都将清理这些资源以避免泄漏。如果您手动处理在没有代码手动调用的情况下无法进行GC的资源,则您当然要为此承担责任