SpringBoot3.1.5+HttpClient5连接池配置RestTemplate读取超时问题
解决RestTemplate结合Httpclient5连接池配置读取超时的问题
在Spring Boot 3.1.5搭配apache.httpcomponents.client5:httpclient5:5.2.1的场景下,不能再通过RestTemplateBuilder.setReadTimeout()来配置读取超时——因为HttpComponentsClientHttpRequestFactory的setReadTimeout方法已被标记为废弃,直接调用会触发异常。正确的做法是通过HttpClient自身的RequestConfig来统一配置超时参数,再结合连接池管理器构建HttpClient,最后注入到RestTemplate中。
完整可运行代码示例
private static RestTemplate pooledRestTemplate() { // 配置连接池 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(2000); connectionManager.setDefaultMaxPerRoute(2000); // 配置超时参数(连接超时、读取超时等) RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(Duration.ofMinutes(5)) .setResponseTimeout(Duration.ofMinutes(5)) // 对应原读取超时 .build(); // 构建HttpClient,同时传入连接池和超时配置 HttpClient httpClient = HttpClientBuilder.create() .setConnectionManager(connectionManager) .setDefaultRequestConfig(requestConfig) .build(); // 构建RestTemplate,无需再通过RestTemplateBuilder设置超时 return new RestTemplateBuilder() .requestFactory(() -> new HttpComponentsClientHttpRequestFactory(httpClient)) .build(); }
关键说明
RequestConfig.setResponseTimeout()对应原来的读取超时,setConnectTimeout()对应连接超时,这是Httpclient5推荐的配置方式。- 把超时配置绑定到HttpClient后,
HttpComponentsClientHttpRequestFactory会自动继承这些配置,不需要再通过RestTemplateBuilder的超时方法设置,避免触发废弃方法的异常。 - 连接池的配置逻辑保持不变,依然通过
PoolingHttpClientConnectionManager设置最大连接数和单路由最大连接数。
内容的提问来源于stack exchange,提问作者wuttke
相关产品推荐
相关产品推荐

