RestTemplate仅能同时维持2个连接,请求阻塞问题排查求助
问题原因
你当前的RestTemplate配置里,HttpClient使用了默认的连接池参数,其中默认最大总连接数是2,所以超过2个并发请求时,后续请求会被阻塞等待空闲连接。
解决方案
需要显式配置HttpClient的连接池参数,调整最大总连接数和每个路由的最大连接数,示例配置如下:
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true; SSLContext sslContext = new SSLContextBuilder() .loadTrustMaterial(null, acceptingTrustStrategy) .build(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext); // 配置连接池 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); // 设置最大总连接数,根据业务需求调整 connectionManager.setMaxTotal(20); // 设置每个路由的最大连接数,根据目标服务数量和并发需求调整 connectionManager.setDefaultMaxPerRoute(10); CloseableHttpClient httpClient = HttpClients.custom() .setSSLSocketFactory(socketFactory) .setConnectionManager(connectionManager) // 绑定连接池 .build(); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); // 可选:设置连接超时、读取超时 factory.setConnectTimeout(5000); factory.setReadTimeout(10000); return new RestTemplate(factory);
关键参数说明
setMaxTotal:设置连接池的最大总连接数,控制所有目标服务的并发连接总数。setDefaultMaxPerRoute:设置单个路由(即单个目标服务地址)的最大连接数,避免对单个服务的连接占用过多资源。- 额外的超时配置可以避免请求长时间挂起,提升服务稳定性。
内容的提问来源于stack exchange,提问作者user5301398
相关产品推荐
相关产品推荐

