keepAliveStrategy部分
默认的话,是从response里头读timeout参数的,没有读到则设置为-1,这个代表无穷,这样设置是有点问题了
https会报read time out
如果头部信息Keep-Alive在响应中不存在,HttpClient假设连接无限期的保持活动。然而许多现实中的HTTP服务器配置了在特定不活动周期之后丢掉持久连接来保存系统资源,往往这是不通知客户端的。
Connection eviction policy
一个经典的阻塞 I/O 模型的主要缺点是网络套接字仅当 I/O 操作阻塞时才可以响应 I/O 事件。当一个连接被释放返回管理器时,它可以被保持活动状态而却不能监控套接字的状态和响应任何 I/O 事件。如果连接在服务器端关闭,那么客户端连接也不能去侦测连接状态中的变化和关闭本端的套接字去作出适当响应。
唯一可行的而不涉及到每个对空闲连接的套接字模型线程解决方案,是使用专用的监控线程来收回因为长时间不活动而被认为是过期的连接。监控线程可以周期地调用 ClientConnectionManager#closeExpiredConnections()方法来关闭所有过期的连接,从连接池中收回关闭的连接。它也可以选择性调用ClientConnectionManager#closeIdleConnections()方法来关闭所有已经空 闲超过给定时间周期的连接
ConnTimeToLive
http连接池connection的存活时间
默认构造的话,timeToLive是-1,如果默认是-1的话,则不失效
当getKeepAliveDuration为-1以及connTimeToLive为-1的时候,closeExpiredConnections方法其实是没有用的,查看debug日志会出现
1 | o.a.http.impl.client.DefaultHttpClient 509 : Connection can be kept alive indefinitely |
当getKeepAliveDuration不为-1的话,假设是5s,则日志可能是这样的
1 | o.a.http.impl.execchain.MainClientExec 285 : Connection can be kept alive for 5000 MILLISECONDS |