我试图了解 HttpClient 中各种超时配置之间的区别以及最简单的配置方法。
此代码中显示了各种选项:
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(connectionRequestTimeout, TimeUnit.MILLISECONDS)
.setResponseTimeout(responseTimeout, TimeUnit.MILLISECONDS)
.setConnectTimeout(connectTimeout, TimeUnit.MILLISECONDS) // Deprecated - Use {@link ConnectionConfig.Builder#setConnectTimeout(Timeout)}.
.build();
ConnectionConfig connectionConfig = ConnectionConfig.custom()
.setConnectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
.setSocketTimeout(socketTimeout, TimeUnit.MILLISECONDS)
.build();
SocketConfig socketConfig = SocketConfig.custom()
.setSoTimeout(socketTimeout, TimeUnit.MILLISECONDS)
.build();
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = PoolingHttpClientConnectionManagerBuilder.create()
.setDefaultConnectionConfig(connectionConfig)
.setDefaultSocketConfig(socketConfig)
.build();
HttpClient httpClient = HttpClientBuilder.create()
.setConnectionManager(poolingHttpClientConnectionManager)
.setDefaultRequestConfig(requestConfig)
.build();
我目前的理解是这样的:
ConnectionRequestTimeout
是从池中获取连接所需的时间 - 如果在负载下则相关。
ConnectTimeout
是建立连接所需的时间。
但是有什么区别:
RequestConfig.setResponseTimeout()
ConnectionConfig.setSocketTimeout()
SocketConfig.setSoTimeout()
它们似乎都是请求的读取/响应超时。我只需要设置其中一项吗? 从一些有限的测试来看,似乎
ResponseTimeout
覆盖了其他可能暗示这就是我所需要的。
在这种情况下,最好使用
RequestConfig
来设置所有三个,但 ConnectTimeout
已被弃用并移至 ConnectionConfig
,其中也包含 SocketTimeout
。
我将其与 SpringBoot 3 / Spring 6 一起使用,最近删除了
readTimeout
上的 HttpComponentsClientHttpRequestFactory
配置选项似乎意味着最好直接在 HttpClient 上进行设置。
在您的情况下,在 RequestConfig 中设置 ResponseTimeout 通常可以满足您管理请求等待响应时间的需求,从而更容易配置和理解。这是简化事情的建议方法:
这是一个简化的配置:
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(connectionRequestTimeout, TimeUnit.MILLISECONDS)
.setResponseTimeout(responseTimeout, TimeUnit.MILLISECONDS)
.build();
ConnectionConfig connectionConfig = ConnectionConfig.custom()
.setConnectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
.build();
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = PoolingHttpClientConnectionManagerBuilder.create()
.setDefaultConnectionConfig(connectionConfig)
.build();
HttpClient httpClient = HttpClientBuilder.create()
.setConnectionManager(poolingHttpClientConnectionManager)
.setDefaultRequestConfig(requestConfig)
.build();
此方法使配置保持集中和可管理,利用 ResponseTimeout 作为主要超时,同时确保在 ConnectionConfig 中正确配置 ConnectTimeout。此设置应该与 Spring Boot 3 / Spring 6 配合良好,与超时处理方面的最新更新保持一致。