HttpClient4.X 升级 入门 + http连接池使用
来源:互联网 发布:软件著作权的申请 编辑:程序博客网 时间:2024/05/22 07:02
在一次服务器异常的排查过程当中(服务器异常排查的过程我会另起文章),我们决定使用HttpClient4.X替代HttpClient3.X或者HttpConnection。
为什么使用HttpClient4?主要是HttpConnection没有连接池的概念,多少次请求就会建立多少个IO,在访问量巨大的情况下服务器的IO可能会耗尽。
HttpClient3也有连接池的东西在里头,使用MultiThreadedHttpConnectionManager,大致过程如下:
可以看出来,它的方式与jdbc连接池的使用方式相近,我觉得比较不爽的就是需要手动调用releaseConnection去释放连接。对每一个HttpClient.executeMethod须有一个method.releaseConnection()与之匹配。
HttpClient4在这点上做了改进,使用我们常用的InputStream.close()来确认连接关闭(4.1版本之前使用entity.consumeContent()来确认内容已经被消耗关闭连接)。具体方式如下:
2012-03-06更新:
有网友提出调用in.close()是否会关闭底层socket,事情是这样的:
好说完了连接池的使用流程,现在来说一说连接池在使用时最重要的几个参数。我用4.1的版本实现了一个简单的HttpConnectionManager,代码如下:
最大连接数、获取连接的最大等待时间、读取超时时间 这些配置应该比较容易理解,一般的连接池都会有这些配置,比较特别的是 每个路由(route)最大连接数 。
什么是一个route?
这里route的概念可以理解为 运行环境机器 到 目标机器的一条线路。举例来说,我们使用HttpClient的实现来分别请求 www.baidu.com 的资源和 www.bing.com 的资源那么他就会产生两个route。
这里为什么要特别提到route最大连接数这个参数呢,因为这个参数的默认值为2,如果不设置这个参数值默认情况下对于同一个目标机器的最大并发连接只有2个!这意味着如果你正在执行一个针对某一台目标机器的抓取任务的时候,哪怕你设置连接池的最大连接数为200,但是实际上还是只有2个连接在工作,其他剩余的198个连接都在等待,都是为别的目标机器服务的。
怎么样蛋疼吧,我是已经有过血的教训了,在切换到HttpClient4.1的起初没有注意到这个配置,最后使得服务承受的压力反而不如从前了,所以在这里特别提醒大家注意。
HttpClient4.X 教程下载:
http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient-contrib/docs/translated-tutorial/httpclient-tutorial-simplified-chinese.pdf
关于版本的补充:
网友w2449008821提醒之后我才发现在HttpClient4.1+的版本ConnManagerParams已经被Deprecated了。
我在写这篇日志的时候时候的httpclient 版本是4.0.3,从4.0版本之后ConnManagerParams被Deprecated,没想到一个小版本升级会有这么大变化。
官网教程举例了新的连接池设置:
ConnManagerParams的功能被挪到了 ThreadSafeClientConnManager 和 HttpConnectionParams两个类:
static ConnPerRoute
getMaxConnectionsPerRoute(HttpParams params)
Deprecated. use
ThreadSafeClientConnManager.getMaxForRoute(org.apache.http.conn.routing.HttpRoute)
static int
getMaxTotalConnections(HttpParams params)
Deprecated. use
ThreadSafeClientConnManager.getMaxTotal()
static long
getTimeout(HttpParams params)
Deprecated. use
HttpConnectionParams.getConnectionTimeout(HttpParams)
static void
setMaxConnectionsPerRoute(HttpParams params, ConnPerRoute connPerRoute)
Deprecated. use
ThreadSafeClientConnManager.setMaxForRoute(org.apache.http.conn.routing.HttpRoute, int)
static void
setMaxTotalConnections(HttpParams params, int maxTotalConnections)
Deprecated. use
ThreadSafeClientConnManager.setMaxTotal(int)
static void
setTimeout(HttpParams params, long timeout)
Deprecated. use
HttpConnectionParams.setConnectionTimeout(HttpParams, int)
参考:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/conn/params/ConnManagerParams.html
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e638
- HttpClient4.X 升级 入门 + http连接池使用
- HttpClient4.X 升级 入门 + http连接池使用
- HttpClient4.X 升级 入门 + http连接池使用
- HttpClient4.X 升级 入门 + http连接池使用-too many open files
- httpclient4.x 使用连接池发送https请求使用总结
- HttpClient4.X连接池使用及超时设置
- httpclient4.x 使用连接池发送https请求
- HttpClient4.0 Http连接池技术简介
- HttpClient4.5 http连接池示例
- HttpClient4.5 使用http连接池发送http请求深度示例
- HttpClient4.5 使用http连接池发送http请求深度示例
- (转) httpclient4.x 使用连接池发送https请求使用总结
- HttpClient4.x 使用总结
- httpClient4.3x 使用
- httpclient4.2.1 连接池
- HttpClient4.x的一些使用
- HttpClient4.x客户端身份验证(HTTPS安全连接)
- HttpClient4.4 进行Http连接通讯
- Shiro 实战
- web监听器
- krpano的JavaScript接口使用
- cocos2d 打包错误集合
- Hadoop YARN常见问题以及解决方案
- HttpClient4.X 升级 入门 + http连接池使用
- 冒泡,选择,插入,希尔,归并,快排,基数排序
- 计算两个日期之间的天数
- Hive安装出现错误总结
- mtk kernel
- 【Algothrim】堆排序
- 为shopnc搭建LINUX环境
- [java异常]异常未捕获时导致请求循环发送
- httpClient 4.5.2 实现连接池