天天看點

[Java] HttpClient有個古怪的stalecheck選項

打開stale check會讓每次http請求額外消耗15毫秒。而且stalecheck選項預設是打開的。

這有必要嗎????

在區域網路裡面調用web api service的時候會死人的。

http://stackoverflow.com/questions/11219325/why-does-defaulthttpclient-send-data-over-a-half-closed-socket

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

http://www.mail-archive.com/[email protected]/msg02710.html

去查了一些資料,發現我們為了性能都應該關閉stalecheck。

有人建議java的httpClient需要在連接配接池裡面加上一個idle monitor thread去把broken的連接配接去除掉。否則re-use的stale connection可能已經被server斷開了,則會引起異常。

但是由于java的傳統通訊方式是阻塞的,是以全局的idle monitor thread是無法通用的。為了支援大量連接配接,為每個連接配接配置一個monitor thread也是不可行的。

是以,apache httpClient的官方文檔建議:

ClientConnectionManager#closeExpiredConnections()

ClientConnectionManager#closeIdleConnections()

調用者要自己定時調用上述兩個方法之一,來減少broken stale connections

與此同時,調用者需要自己決定,當發現io exception的時候,是否要retry。