Spring Boot3.0升级后HttpClient5 RequestConfig无setSocketTimeout方法如何解决?
Apache HttpComponents 5.x 迁移:RequestConfig 无 setSocketTimeout 解决方案
在从Java 11+Spring Boot 2.x(依赖Apache HttpComponents 4.x)迁移到Java 17+Spring Boot 3.x(依赖HttpComponents 5.x)的过程中,原4.x版本RequestConfig.Builder中的setSocketTimeout方法在5.x版本被移除了。这是因为HttpComponents 5.x对超时配置做了职责拆分:
RequestConfig仅负责请求相关超时:比如连接池获取连接的超时(connectionRequestTimeout)、建立TCP连接的超时(connectTimeout)- Socket读取超时(原socketTimeout)被移至
ConnectionConfig中,由它负责配置连接层面的读写超时
替换后的代码示例
// 1. 构建ConnectionConfig,配置socket读取超时 ConnectionConfig connectionConfig = ConnectionConfig.custom() .setSocketTimeout(clientConnection.getReadTimeout()) .build(); // 2. 构建RequestConfig,配置请求相关超时 RequestConfig requestConfig = RequestConfig.custom() .setConnectionRequestTimeout(clientConnection.getConnectionRequestTimeout()) .setConnectTimeout(clientConnection.getConnectTimeout()) .build(); // 3. 初始化HttpClient时同时设置全局默认的ConnectionConfig和RequestConfig return HttpClients.custom() .setKeepAliveStrategy(httpClient4connectionKeepAliveStrategy) .setConnectionManager(httpClient4ConnectionManager(withCustomSslConfig)) .setDefaultConnectionConfig(connectionConfig) .setDefaultRequestConfig(requestConfig) .build();
额外说明
如果需要为单个请求单独配置socket超时,而非使用全局默认值,可以在构建请求时指定ConnectionConfig:
HttpGet httpGet = HttpGet.create("https://example.com"); httpGet.setConnectionConfig(ConnectionConfig.custom() .setSocketTimeout(5000) // 单独设置该请求的读取超时 .build());
内容的提问来源于stack exchange,提问作者Ivajlo Iliev
相关产品推荐
相关产品推荐

