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

Spring boot 正确设置Spring 5 WebClient的请求超时,spring-boot,spring-webflux,Spring Boot,Spring Webflux,我希望能够为Spring5WebClient(SpringBootVersion2.0.0.RELEASE)发出的请求设置超时值。我的第一次尝试是按照此答案中的建议配置WebClient:。如果服务器没有及时响应,则此操作将正确超时。但这还有其他含义:在WebClient成功发出响应后(在.retrive()或.exchange()之后),计时器将继续运行,因此如果达到超时值,则会引发超时异常 这似乎是ReadTimeoutHandler在经过配置的时间段后超时的预期行为,并且netty通道没有

我希望能够为Spring5WebClient(SpringBootVersion2.0.0.RELEASE)发出的请求设置超时值。我的第一次尝试是按照此答案中的建议配置WebClient:。如果服务器没有及时响应,则此操作将正确超时。但这还有其他含义:在WebClient成功发出响应后(在
.retrive()
.exchange()
之后),计时器将继续运行,因此如果达到超时值,则会引发超时异常

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

所以。。。就我的问题而言:如何正确地为每个客户端请求设置一个超时时间对使用WebClient进行的每个http调用?我有一种可能的方法:在每个webClient调用的顶部链接
timeout
Mono方法。我想知道在服务中断的最终情况下,这是否会导致某种资源泄漏。还有其他选择吗


提前感谢

你问题的这一部分并不完全清楚

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

在反应堆网络级别,您可以配置以下几项:

  • 连接超时,即客户端与服务器建立连接所需的最长时间
  • 读取超时,客户端在没有从服务器接收数据且响应不完整时应等待的最长时间
看看你的问题,你似乎在指出流式场景,即服务器可以在事件发生时发送事件,可能会触发此超时。我同意这一点

有两种解决方案:

  • 您可以为流式传输场景配置单独的连接器实例,这样就不会遇到此问题
  • 您可以将
    timeout
    操作符附加到反应链中。如果出现超时或错误,所有处理池资源的SpringWebFlux操作都会清理这些资源以避免泄漏。如果您手动处理没有代码手动调用就无法进行GCD的资源,那么您当然要对此负责