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

Correctly setting request timeout for Spring 5 WebClient

我希望能够为使用 Spring 5 WebClient(Spring 引导版本 2.0.0.RELEASE)发出的请求设置超时值。我的第一次尝试是按照此答案的建议配置 WebClient:。如果服务器没有及时响应,这会正确超时。但这也有其他含义:在 WebClient 成功发出响应后(在 .retrive().exchange() 之后)计时器继续运行,这样如果超时达到值然后引发超时异常。

这似乎是预期的行为,因为在配置的时间段过后 ReadTimeoutHandler 超时并且 netty 通道未读取任何数据(忽略先前读取的数据)。 换句话说:您使用 WebClient 调用外部 http 服务(已配置 ReadTimeoutHandler),然后工作处理程序执行一些可能比超时值花费更多时间的工作,因此... io.netty.handler.timeout.ReadTimeoutException 被抛出。

所以...关于我的问题:如何正确设置 每个客户端请求 超时到每个使用 WebClient 进行的 http 调用?我有一种可能的方法:在每个 webClient 调用之上链接 Monotimeout 方法。我想知道这是否会在最终服务中断的情况下导致某种资源泄漏。还有其他选择吗?

提前致谢!!!

你的这部分问题不是很清楚。

This correctly times out if the server does not respond in time. But this also has other implication: after a WebClient successful emission of a response (after .retrive() or .exchange()) the timer keeps going on, such that if the timeout value is reached then a timeout exception is raised.

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

  • 连接超时,即客户端与服务器建立连接所需的最长时间
  • 读取超时,客户端在未从服务器接收到数据且响应不完整时应等待的最长时间

从您的问题来看,您似乎是在指出服务器可以在事件到来时发送事件的流式传输场景可以触发此超时。我同意。

有两种解决方案:

  1. 您为流式传输场景配置了一个单独的连接器实例,因此您不会运行陷入这个问题
  2. 您可以将 timeout 运算符附加到反应链。如果出现超时或错误,所有 Spring WebFlux 处理池化资源的操作都会清理这些资源以避免泄漏。如果您手动处理无法在没有代码手动调用的情况下无法进行 GC 处理的资源,那么您当然要对此负责