首页 文章

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

提问于
浏览
1

我希望能够为使用Spring 5 WebClient(Spring Boot版本2.0.0.RELEASE)发出的请求设置超时值 . 我的第一次尝试是按照这个答案的建议配置WebClient:Spring 5 webflux how to set a timeout on Webclient . 如果服务器没有及时响应,则会正确超时 . 但这也有其他含义: after a WebClient successful emission of a response (在 .retrive().exchange() 之后)定时器继续运行,这样如果达到超时值,则会引发超时异常 .

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

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

提前致谢!!!

1 回答

  • 1

    这部分问题并不完全清楚 .

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

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

    • 连接超时,即客户端与服务器 Build 连接的最长时间

    • 读取超时,客户端在未从服务器接收数据且应答未完成时应等待的最长时间

    看看你的问题,似乎你指出流媒体场景,服务器可以在它们到来时发送事件,可以触发这个超时 . 我同意这一点 .

    有两种解决方案:

    • 您为流式方案配置了单独的连接器实例,因此您不会遇到此问题

    • 您可以将 timeout 运算符附加到您的反应链 . 在超时或错误的情况下,处理池化资源的所有Spring WebFlux操作都会清理这些资源以避免泄漏 . 如果没有来自您的代码的手动调用,您就不能进行GC操作

相关问题