上面介绍了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
|