1

我正在使用RestTemplate来执行并发HTTP请求。一段时间后,我开始变得Rest模板 - 没有可用的缓冲区空间(达到最大连接数?)

java.net.SocketException异常:没有可用的缓冲空间(最大 连接达到?)

  1. 我知道,这是关系到TIME_WAIT状态插槽。
  2. 我已经尝试安装Windows 7修复程序,大多数消息来源鼓励。
  3. 我配置RestTemplate使用HttpClient如下:

    val httpClient = HttpClientBuilder.create() 
          .setMaxConnPerRoute(properties.concurrencyLimit) 
          .setMaxConnTotal(properties.concurrencyLimit) 
          .build() 
    return RestTemplate(HttpComponentsClientHttpRequestFactory(httpClient)) 
    
  4. 我曾尝试使用其他十亿配置HttpClient

  5. 我试图20-100
之间不同量的并发请求的

就在我要去按发布您的问题按钮,我的同事发现了一个解决方案,这没有任何意义,我:

val httpClient = HttpClientBuilder.create() 
      .setMaxConnPerRoute(properties.concurrencyLimit * 2) 
      .setMaxConnTotal(properties.concurrencyLimit * 2) 
      .build() 
    return RestTemplate(HttpComponentsClientHttpRequestFactory(httpClient)) 

基本上,当我设置连接池的两倍大线程数,整个事情就像一个魅力。

为什么?为什么不是第一次配置工作和第二次?

所有依赖项都由Spring Boot 1.4.0.RELEASE父pom管理。

+0

如果使用异步连接器或异步然后servlet,而你是让你休息调用线程可以服务于其他请求,当NEX请求到达,并试图获取连接,使HTTP调用就没有连接左 –

+0

意思这是一项批量工作。它所做的只是:它击中两个端点并合并结果,最后打印报告。 – grzegorztj

+0

在你的批处理中,你会一个接一个地执行http请求吗?然后在http 1.1中,如果当前http(under under tcp)连接忙于执行http请求,则其他请求将采用新连接,直到http 2.0才会有多路复用。因此,您的批处理将使用多个http连接,并且可以更快地耗尽您的线程处理批次。 –

回答

1

根据路线汇集连接。由于您至少有2条路由,所以每条路由的总连接数应至少为最大连接数的2倍。另请参阅其他相关post是的,如果您逐一处理您的批处理或存在一些异步性质(我不太确定您是如何使用concurrencyLimit的),我会建议您甚至可以使用conenctionPool,而不是使用多个线程。见除了从here

PoolingHttpClientConnectionManager是一个更复杂的实现,管理客户端连接池,并能服务于来自多个执行线程的连接请求。连接汇总在每个路由的基础上。通过从池中租用连接而不是创建全新的连接,可以为管理员在池中具有可用连接的路由请求提供服务。 PoolingHttpClientConnectionManager保持每个路由和总共连接的最大限制。默认情况下,此实现将为每个给定路由创建不超过2个并发连接,总共不会有20个连接。对于许多真实世界的应用程序来说,这些限制可能会被证明过于严格,特别是如果他们使用HTTP作为其服务的传输协议。

相关问题