2016-08-01 28 views
3

我有一些麻煩與HTTP組件的右側設置。目前微服務從提供商處提取JSON內容,對其進行處理並將其發送到下一個服務以供進一步處理。主要問題是這個微服務創建了大量的CLOSE_WAIT套接字連接。我瞭解,「KEEP-ALIVE」的整個概念應保持連接處於打開狀態,直到我關閉它爲止,但服務器可能會由於某些原因而斷開連接並創建此CLOSE_WAIT套接字。無法配置「保活」駱駝HTTP組件

我創建了一個小型服務用於調試/測試目的,使一個GET調用谷歌,但即使這樣連接保持打開狀態,直到我關閉程序。我已經嘗試了許多不同的解決方案:

  • .setHeader( 「連線」,常數( 「關閉」))
  • -Dhttp.keepAlive = false作爲VM參數
  • 從駱駝-HTTP切換到駱駝-Http4
  • httpClient.soTimeout = 500(駱駝-HTTP),httpClient.socketTimeout = 500和connectionTimeToLive = 500(駱駝HTTP4)
  • .setHeader( 「連接」,簡單( 「保持活動」))和 .setHeader( 「保持活動」,簡單( 「超時= 10」))(駱駝HTTP4)
  • 通過調試DefaultConnectionKeepAliveStrategy從-1(永不結束)到Camel-HTTP4中的特定值的響應來設置 - 可以工作,但我無法注入我自己的策略。

,但我沒有成功。所以也許你們中的一個人可以幫我:

  • 我該如何告訴Camel-HTTP它應該在特定的時間通過時關閉連接?例如,該服務每隔一小時從內容提供者處抽取。 3-4小時後,HttpComponent應該在拉動之後關閉連接,並在下一次拉動時重新打開連接。目前,每個連接都將被放回到MultiThreadedHttpConnectionManager中,並且套接字仍處於打開狀態。
  • 如果這是不可能做到這一點與駱駝HTTP:我怎麼能注入HttpClientBuilder到我的路線的創作?我知道它應該可以通過httpClient選項,但我不明白文檔的特定部分。

謝謝大家的幫助

回答

0

您可以提供自己的​​到HTTP4。一般來說,您應該使用org.apache.http.impl.conn.PoolingHttpClientConnectionManager的實例,您可以通過將org.apache.http.config.SocketConfig配置爲連接管理器的setDefaultSocketConfig方法來將其配置爲org.apache.http.config.SocketConfig

如果你使用Spring的Java配置,你將有一個方法:

@Bean 
PoolingHttpClientConnectionManager connectionManager() { 
    SocketConfig socketConfig = SocketConfig.custom() 
      .setSoKeepAlive(false) 
      .setSoReuseAddress(true) 
      .build(); 
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); 
    connectionManager.setDefaultSocketConfig(socketConfig); 
    return connectionManager; 
} 

,然後你只是用它在你的終端定義,就像這樣:clientConnectionManager=#connectionManager

0

它可以是如果它們閒置了配置的時間,則關閉空閒連接。您可以通過爲Camel Http組件配置空閒連接超時來實現此目的。 駱駝Http提供這樣做的接口。

演員org.apache.camel.component.http4。HttpComponent到PoolingHttpClientConnectionManager

 PoolingHttpClientConnectionManager poolingClientConnectionManager = (PoolingHttpClientConnectionManager) httpComponent 
       .getClientConnectionManager(); 

     poolingClientConnectionManager.closeIdleConnections(5000, TimeUnit.MILLISECONDS); 

訪問這裏[http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.html#closeIdleConnections(long,java.util.concurrent.TimeUnit中)]