2014-01-20 102 views

回答

29

超時在RequestConfig設置,所以你可以設置默認時HttpClientBuilder被調用。

例如假設您的超時變量是在幾秒鐘內創建自定義RequestConfig你可以做這樣的事情:

RequestConfig config = RequestConfig.custom() 
    .setSocketTimeout(timeout * 1000) 
    .setConnectTimeout(timeout * 1000) 
    .build(); 

然後,您可以建立自己的HttpClient設置默認RequestConfig這樣的:

HttpClients.custom() 
    .setDefaultRequestConfig(config); 
+1

這不是我要找的。以上是readTimeout和connectTimeout。我正試圖找出如何在打開的連接上設置「驅逐」策略。考慮一個峯值,你可以在每個地址達到1000個連接。你如何指示Apache客戶端在X秒後關閉空閒連接? – YaOg

+0

您應該在構建HttpClient並實現ConnectionKeepAliveStrategy接口時查看setKeepAliveStrategy()。這告訴客戶在重新使用之前連接可以閒置多久。 – Brett

+1

這個答案是錯誤的。 setConnectTimeout設置連接到服務器的超時時間。 setSocketTimeout在讀取操作期間設置超時。 OP在詢問空閒超時。 –

8

不能在Apache HTTP Client的配置中設置空閒連接超時。原因是這樣做會導致性能開銷。

該文檔清楚地說明了原因,並給出了可以複製的空閒連接監視器實現的示例。本質上,這是你運行定期調用closeIdleConnectionsHttpClientConnectionManager

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

一個經典阻塞I的主要缺陷另一個線程/ O模型是網絡插座可以到I/O事件做出反應僅當在I/O操作中被阻塞時。當連接釋放回管理器時,它可以保持活動狀態,但它無法監視套接字的狀態並對任何I/O事件做出反應。如果連接在服務器端關閉,則客戶端連接無法檢測連接狀態的更改(並通過關閉套接字來適當地作出反應)。 HttpClient會嘗試通過測試連接是否爲「陳舊」來緩解該問題,即在使用連接執行HTTP請求之前,該連接是不再有效的,因爲它在服務器端已關閉。過時的連接檢查不是100%可靠的,並且會爲每個請求執行增加10到30毫秒的開銷。對於空閒連接,每套接字模型不涉及單線程的唯一可行解決方案是專用監視器線程,用於驅除由於長時間不活動而被認爲已過期的連接。監視線程可以定期調用ClientConnectionManager#closeExpiredConnections()方法關閉所有過期的連接並從池中驅逐關閉的連接。它還可以選擇調用ClientConnectionManager#closeIdleConnections()方法關閉在給定時間段內閒置的所有連接。