[Java] HttpClient有个古怪的stalecheck选项

时间:2023-03-08 16:30:06

打开stale check会让每次http请求额外消耗15毫秒。而且stalecheck选项缺省是打开的。

这有必要吗????

在局域网里面调用web api service的时候会死人的。

http://*.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/httpclient-users@hc.apache.org/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。