问题描述
HttpClient
提供了各种要配置的“超时”,有两个让我感到困惑:
- responseTimeout:
This is time that takes to receive a response after sending a request
- ReadTimeoutHandler:
Raises a ReadTimeoutException when no data was read within a certain period of time
有人可以解释一下两者之间的主要区别吗?
一般情况-使用Spring响应式WebClient
进行呼叫,该响应式在后台使用HttpClient
:
- 建立与远程服务器>>>的连接,我们在这里利用
ChannelOption.CONNECT_TIMEOUT_MILLIS
- TLS握手>>>,这里我们正确地利用了
ReadTimeoutHandler
? - 发送请求
- ...等待...
- 接收响应>>>,其中“超时”优先于此:响应/读取?
解决方法
如果使用WebFlux和Netty,则httpClient
应该是Netty httpClient
。你在那里看看吗? https://projectreactor.io/docs/netty/release/api/reactor/netty/http/client/HttpClient.html
-
连接超时->如果您无法连接到 远程服务器,无论出于何种原因,都将使用此timeOut。
-
TLS握手,请检查:
reactor.netty.http.client.HttpClient#secure(
): 如果未进行其他配置,Netty将假定10秒钟超时 握手如果要定义另一个超时,请使用reactor.netty.tcp.sslHandshakeTimeout
https://projectreactor.io/docs/netty/release/api/reactor/netty/http/client/HttpClient.html#secure-- -
现在已建立连接,您可以发送请求。通过 使用
ReadTimeoutHandler
,您可以定义等待多长时间 通过连接接收数据。例如,这可能是 完整响应,如果响应是流式传输,则为字节。responseTimeout
中的httpClient
执行相同的操作。两者都使用给定的TcpClient
设置创建timeOut
。 ReadTimeoutHandler的好处在于,您将获得一个执行超时时定义的逻辑的回调。
如@ violeta-georgieva的评论中建议的那样> Netty HttpClient - response timeout vs. read timeout,应使用“ responseTimeout
”。