3

图片描述

上图时连接池类图关系。
PoolingHttpConnectionManager:就是我们通常所说的连接池
CPool:实际池化连接保持者
RouteSpecificPool:与Route关联的连接池

说明:
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列表中移除。

获取连接

图片描述

释放连接

图片描述

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

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


xbynet
1k 声望124 粉丝

不雨花犹落,无风絮自飞