搜索系统16:从HttpClient学习连接池

Posted 中中

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索系统16:从HttpClient学习连接池相关的知识,希望对你有一定的参考价值。

一.HttpClient请求的一般过程
1.拿连接


2.与服务器建立连接(new Socket)

搜索系统16:从HttpClient学习连接池


3.从服务获取结果

搜索系统16:从HttpClient学习连接池


4.keepAlive的判断
在代码org.apache.http.impl.execchain.MainClientExec里请求结束后(requestExecutor.execute),用策略模式来判断是否keepAlive
if (reuseStrategy.keepAlive(response, context))
从以下实现可以看出,keepAlive的标志是从Response的Header中取得的

搜索系统16:从HttpClient学习连接池


还有最后一句,如果header里没,http版本号大于1.0,也会保持连接。
如果没有keepAlive那么就会执行connHolder.markNonReusable,这个就是把ConnectHolder的reusable置为false。不过我测试了很多的网站,都返回了Keep-Alive,应该都可以保持连接一段时间。

5.归还连接
在ConnectionHolder类里可以看到以下代码:

搜索系统16:从HttpClient学习连接池


如果reusable=false,也就是没有keepalive,就会关闭连接。

二、http请求头的格式怎么获取?
以访问https://www.baidu.com为例:
在代码org.apache.http.impl.io.SessionOutputBufferImpl.flushBuffer方法内打断点

搜索系统16:从HttpClient学习连接池

搜索系统16:从HttpClient学习连接池


再看一下这个HttpRoute对象的hashcode方法,恩,就是这些因素决定了是不是同一个请求。




以上是关于搜索系统16:从HttpClient学习连接池的主要内容,如果未能解决你的问题,请参考以下文章

org.apache.httpcomponents:httpclient 工具类

使用 HttpClient 的 HTTP 连接池

HttpClient连接池耗尽引发雪崩问题

学习充电Http 持久连接与 HttpClient 连接池

httpclient 连接池测试

HttpClient 基于连接池的使用