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作爲其服務的傳輸協議。

相關問題