Apache HttpClient源码分析之链接池

图片描述

上图时链接池类图关系。
PoolingHttpConnectionManager:就是咱们一般所说的链接池
CPool:实际池化链接保持者
RouteSpecificPool:与Route关联的链接池apache

说明:
CPool与RouteSpecificPool里的链接均分为三种–available, leased和pending,分别对应空闲,占用和堵塞三种状态,链接池为这三种状态创建三个列表(List/Set)。CPool对链接数的管理则有两个维度,分别是全局最大数和单route最大数。CPool维护着route与RouteSpecificPool的关系。操做链接时,会先经过RouteSpecificPool进行操做,而后对CPool上进行操做。当PoolingHttpConnectionManager请求一个链接时,CPool会返回Future<PoolEntry>。而CPoolEntry会维护ManagedHttpClientConnection与HttpRoute及存活时间等。最终用户获得的是PoolingHttpConnectionManager里封装而成的链接对象CPoolProxy
链接获取请求在没有空闲链接但链接数没达到阈值时经过链接池建立链接并池化放入available或者leased。leased链接数达到阈值时对请求进行堵塞,而且将Future<PoolEntry>放入pending。其余请求释放链接时会唤醒堵塞请求,被唤醒的请求获取到链接后会被从pending列表中移除。spa

获取链接

图片描述

释放链接

图片描述

HttpResponse用HttpResponseProxy封装,HttpResponseProxy同时包含了ConnectionHolder
HttpResponseProxy内部会使用ResponseEntityProxy对HttpResponse及其entity做进一步封装,封装中包含ConnectionHolder,以便在调用releaseConnection,或者关闭entity关闭流时能够释放链接到池中或不可复用时直接关闭。实际上当咱们调用entity.getContent时,返回的是EofSensorInputStream装饰过的InputStream,在stream close时里面会回调ResponseEntityProxy(实现了EofSensorWatcher)的streamClosed方法,从而调用connHolder.releaseConnection();实现链接的释放。.net

参考:
http://hc.apache.org/ 文档及源码
http://blog.csdn.net/szwandcj...3d

相关文章
相关标签/搜索