我正在使用RestTemplate
来执行并发HTTP请求。过了一段时间,我开始
java.net.SocketException:没有可用的缓冲区空间(最大值 连接到达了吗?)
我已将RestTemplate
配置为使用HttpClient
,如下所示:
val httpClient = HttpClientBuilder.create()
.setMaxConnPerRoute(properties.concurrencyLimit)
.setMaxConnTotal(properties.concurrencyLimit)
.build()
return RestTemplate(HttpComponentsClientHttpRequestFactory(httpClient))
我尝试使用其他十亿个HttpClient
配置
就在我要按发布你的问题按钮之前,我的同事找到了一个对我没有任何意义的解决方案:
val httpClient = HttpClientBuilder.create()
.setMaxConnPerRoute(properties.concurrencyLimit * 2)
.setMaxConnTotal(properties.concurrencyLimit * 2)
.build()
return RestTemplate(HttpComponentsClientHttpRequestFactory(httpClient))
基本上,当我将连接池设置为线程数的两倍时,整个过程就像一个魅力。
为什么?为什么没有第一次配置工作和第二次?
所有依赖项都由Spring Boot 1.4.0.RELEASE parent pom。
管理答案 0 :(得分:1)
根据路线汇总连接。由于您至少有2条路由,因此每条路由的连接总数应至少为最大连接数的2倍。另请参阅其他相关的post是的,如果您逐个处理批处理或者存在一些异步性质,我建议甚至使每个死记硬币的conenctionPool更多。(不完全确定如何使用concurrencyLimit)
请参见here:
PoolingHttpClientConnectionManager是一个更复杂的实现,它管理客户端连接池,并且能够为来自多个执行线程的连接请求提供服务。连接以每个路由为基础进行池化。管理员已经在池中提供持久连接的路由请求将通过从池租用连接而不是创建全新连接来提供服务。 PoolingHttpClientConnectionManager维护每个路由和总计的最大连接数限制。默认情况下,此实现将为每个给定路由创建不超过2个并发连接,并且总共不再有20个连接。对于许多实际应用程序,这些限制可能会受到太多限制,特别是如果他们使用HTTP作为其服务的传输协议。