资讯专栏INFORMATION COLUMN

Apache HttpClient源码分析之连接池

YFan / 2829人阅读

摘要:对连接数的管理则有两个维度,分别是全局最大数和单最大数。当请求一个连接时,会返回。而会维护与及存活时间等。最终用户得到的是里封装而成的连接对象。连接数达到阈值时对请求进行堵塞,并且将放入。

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70742.html

相关文章

  • Http请求连接-HttpClient的AbstractConnPool源码分析

    摘要:若使用连接池的方式,来管理连接对象,能极大地提高服务的吞吐量。另外每个对应一个连接池,实现了在级别的隔离,若下游的某台提供服务的主机挂了,无效的连接最多只占用该对应的连接池,不会占用整个连接池,从而拖垮整个服务。 背景 在做服务化拆分的时候,若不是性能要求特别高的场景,我们一般对外暴露Http服务。Spring里提供了一个模板类RestTemplate,通过配置RestTemplate...

    gself 评论0 收藏0
  • Android网络编程2HttpUrlConnection和HttpClient

    摘要:压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。打开来分析一下,不了解和协议原理的请查看网络编程一协议原理这篇文章。当然这次错误是正常的,百度没理由处理我们的这次请求。 前言 上一篇我们了解了HTTP协议原理,这一篇我们来讲讲Apache的HttpClient和Java的HttpURLConnection,这两种都是我们平常请求网络会用到的。无论我们...

    cfanr 评论0 收藏0
  • dubbo源码解析(二十六)远程调用——http协议

    摘要:前言基于表单的远程调用协议,采用的实现,关于协议就不用多说了吧。后记该部分相关的源码解析地址该文章讲解了远程调用中关于协议的部分,内容比较简单,可以参考着官方文档了解一下。 远程调用——http协议 目标:介绍远程调用中跟http协议相关的设计和实现,介绍dubbo-rpc-http的源码。 前言 基于HTTP表单的远程调用协议,采用 Spring 的HttpInvoker实现,关于h...

    xiyang 评论0 收藏0
  • 浅析 jdk11 中 HttpClient 的使用

    摘要:在中也可以直接使用返回的是,然后通过来获取结果阻塞线程,从中获取结果四一点唠叨非常的年轻,网络资料不多,且代码非常精细和复杂,目前来看底层应该是使用了线程池搭配进行异步通讯。 零 前期准备 0 版本 JDK 版本 : OpenJDK 11.0.1 IDE : idea 2018.3 1 HttpClient 简介 java.net.http.HttpClient 是 jdk11 中正式...

    Eminjannn 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<