HttpClient源码解析系列:第四篇:Connection是怎么生成和管理的

本文深入探讨PoolingHttpClientConnectionManager如何管理和生成Connection。内部使用InternalConnectionFactory作为对象工厂,而连接池由抽象类AbstractConnPool管理,尽管CPool在实现上较为简单,其核心功能在于AbstractConnPool的逻辑。
摘要由CSDN通过智能技术生成
上面介绍了HttpClientConnection是最核心的接口
这个接口的使用分布在上图所示的类或者接口中。图中可以看出,分成四个大类:Connection的不同实现,Manager,Operator,Factory。
由于这里不着重考察Connection的实现,所以略过,而考察Manager,Operator,Factory。
经过简单的代码筛查,可以发现在管理HttpClientConnection过程中,它以一个子接口:ManagedHttpClientConnection的形式存在。
这个很容易理解,HttpClientConnection的实例并不是用户new出来的,而是经由Manager管理的,所以衍生出一个Managed的接口。
此外,Operator和Factory也是经由Manager来调用的,所以可以先从 HttpClientConnectionManager 来切入代码。

接口 HttpClientConnectionManager 有两个实现

显然,BasicHttpClientConnectionManager 是最基本的可用版本。那么我们来看一下其中的代码。
从其中的参数可以看到,这里面有一个 Connection和一个Route,也就是说这个基础版的Manager只能管理一个Connection。

来看最核心的方法:getConnection, connect
synchronized HttpClientConnection getConnection( final HttpRoute route, final Object state) {
        Asserts.check(!this.isShutdown.get(), "Connection manager has been shut down");
        if (this.log.isDebugEnabled()) {
            this.log.debug("Get connection for route " + route);
        }
        Asserts.check(!this.leased, "Connection is still allocated");
        if (!LangUtils.equals(this.route, route) || !LangUtils.equals(this.state, state)) {
            closeConnection();
        }
         this.route = route; //创建链接的时候目标主机的信息是一定要的
        this.state = state;
         checkExpiry(); //校验是否存在
         if (this.conn == null) {
            this.conn = this.connFactory.create(route, this.connConfig); // 这个Manager管理唯一一个Connection,如果获取连接的时候不存在则新建一个。
        }
        this
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值