httpclient超时总结(转)
Httpclient超时
背景:
网站这边多次因为httpclient调用超时时间没设置好导致关掉,影响非常不好,而且问题重复出现,查看网络,没有比较明确介绍httpclient所有超时相关的设置(大部分只提到连接超时(connectintimeout),读超时(sockettimeout),对连接池超时提到的比较少),因此本文对超时这块最介绍,其他功能性内容,apache官方提供了比较详细的解析,这里不做讨论。具体可见:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html
网站这边用的是:
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
配置:
privatefinalstaticMultiThreadedHttpConnectionManagermanager=newMultiThreadedHttpConnectionManager();
privatefinalstaticHttpClienthttpclient=newHttpClient(manager);
httpclient.setConnectionTimeout(1000);
httpclient.setTimeout(1000);
现象:
页面无法打开,堆栈信息如下:
Name: trhead-142
State: WAITING onorg.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool@69a4cb
Total blocked: 0 Total waited: 1
Stack trace:
java.lang.Object.wait(Native Method)
org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.doGetConnection(MultiThreadedHttpConnectionManager.java:518)
org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.getConnectionWithTimeout(MultiThreadedHttpConnectionManager.java:416)
org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:153)
org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
com.madding.test.MyRunnable.run(MyTest1.java:53)
java.lang.Thread.run(Thread.java:619)
大部分线程等待在:org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.doGetConnection
分析:
问题:很明显连接池超时没设置,导致请求在线程池中等待,进而引起dubb无法处理其他请求。
解决:加httpclient.setHttpConnectionFactoryTimeout(1000);,设置连接池超时。
说明:废弃方法尽量不要用
进一步分析:
为什么没设置这个会导致请求等待:
MultiThreadedHttpConnectionManager代码在获取连接时去连接池取,而连接池在没设置超时timeToWait为0,即一直处于等待状态,如果没有notify不会结束等待。
试用
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2</version>
</dependency>
发现代码中即使不设置线程池超时,在高并发下也能正常访问,查看代码,发现是因为在默认没设置线程池超时时把连接超时的时间作为线程超时时间,代码如下:
而且httpclient4的代码结构相对3做了很大重构,且实现比较优雅,可以考虑在本地私服把4.x版本添加进来。
完整的超时可参考如下:
staticPoolingClientConnectionManagerconnectionManager=null;
staticHttpClienthttpclient =null;
static{
connectionManager=newPoolingClientConnectionManager();
connectionManager.setMaxTotal(1);
httpclient=newDefaultHttpClient(connectionManager);
httpclient.getParams().setParameter("http.socket.timeout",1000);
httpclient.getParams().setParameter("http.connection.timeout",1000);
httpclient.getParams().setParameter("http.connection-manager.timeout",100000000L);
}
具体测试代码如下:
3.1:
packagecom.madding.test;
importorg.apache.commons.httpclient.DefaultMethodRetryHandler;
importorg.apache.commons.httpclient.HttpClient;
importorg.apache.commons.httpclient.HttpStatus;
importorg.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
importorg.apache.commons.httpclient.methods.GetMethod;
/**
*@author madding.lip
*/
publicclassMyHttpClientTest3_1 {
privatefinalstaticMultiThreadedHttpConnectionManagermanager=newMultiThreadedHttpConnectionManager();
privatefinalstaticHttpClienthttpclient=newHttpClient(manager);
publicstaticvoidmain(String[] args) {
httpclient.getParams().setParameter("http.socket.timeout",1000);
httpclient.getParams().setParameter("http.connection.timeout",1000);
httpclient.getParams().setParameter("http.connection-manager.timeout",60*60L);
// httpclient.setConnectionTimeout(1000);
// httpclient.setTimeout(1000);
// httpclient.setHttpConnectionFactoryTimeout(1000);
for(inti = 0; true;i++) {
newThread(newMyRunnable(httpclient),"trhead-"+ i).start();
try{
Thread.sleep(100);
}catch(InterruptedException e) {
}
}
}
}
classMyRunnableimplementsRunnable {
HttpClienthttpclient=null;
MyRunnable(HttpClient client){
httpclient= client;
}
publicvoidrun() {
GetMethod getMethod =newGetMethod("http://www.apache.org/");
try{
DefaultMethodRetryHandlerretryHandler = newDefaultMethodRetryHandler();
retryHandler.setRetryCount(0);
getMethod.setMethodRetryHandler(retryHandler);
intstatusCode =httpclient.executeMethod(getMethod);
if(statusCode == HttpStatus.SC_OK){
getMethod.getResponseBodyAsString();
}
}catch(Exception e) {
System.err.println(e);
}finally{
getMethod.releaseConnection();
}
}
}
4.2:
packagecom.madding.test;
importjava.io.IOException;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.ClientProtocolException;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpUriRequest;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.impl.conn.PoolingClientConnectionManager;
importorg.apache.http.util.EntityUtils;
/**
*@author madding.lip
*/
publicclassMyHttpClientTest4_2 {
staticPoolingClientConnectionManagerconnectionManager=null;
staticHttpClienthttpclient =null;
static{
connectionManager=newPoolingClientConnectionManager();
connectionManager.setMaxTotal(1);
httpclient=newDefaultHttpClient(connectionManager);
httpclient.getParams().setParameter("http.socket.timeout",1000);
httpclient.getParams().setParameter("http.connection.timeout",1000);
httpclient.getParams().setParameter("http.connection-manager.timeout",100000000L);
}
publicstaticvoidmain(String[] args) {
for(inti = 0; true;i++) {
newThread(newMyTest(httpclient),"trhead-"+ i).start();
try{
Thread.sleep(100);
}catch(InterruptedException e) {
}
}
}
}
classMyTestimplementsRunnable {
staticHttpClienthttpclient =null;
publicMyTest(HttpClient hc){
httpclient= hc;
}
publicvoidrun() {
HttpUriRequest httpget =newHttpGet("http://www.apache.org/");
try{
HttpResponse response =httpclient.execute(httpget);
HttpEntity entity =response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if(entity !=null){
System.out.println("Responsecontent length: " +entity.getContentLength());
EntityUtils.toString(entity);
//System.out.println(EntityUtils.toString(entity));
}
System.out.println("----------------------------------------");
}catch(ClientProtocolException e) {
System.err.println(e);
}catch(IOException e) {
System.err.println(e);
}finally{
if(httpget !=null){
httpget.abort();
}
}
}
}
http://blog.csdn.net/madding/article/details/7638807
httpclient超时总结(转)的更多相关文章
- httpclient 超时设置
最近项目客户反应超时经常出现:现已经总结超时设置: 使用是apache的HttpClient: DefaultHttpClient:请求超时httpclient.getParams().setPara ...
- Httpclient超时timeout设置
一:连接超时:connectionTimeout 1:指的是连接一个url的连接等待时间. 二:读取数据超时:soTimeout 1:指的是连接上一个url,获取response的返回等待时间. Fo ...
- HttpClient超时设置setConnectionTimeout和setSoTimeout
http是基于TCP/IP进行通信的,tcp通过3次握手建立连接,并最终以4次挥手终止通信. 知乎上对三次握手和四次挥手有如下解释: 作者:知乎用户链接:https://www.zhihu.com/q ...
- httpClient 超时时间设置(转)
尊重博主原创,特贴博客链接.copy下来只怕以后链接失效或删掉. 转自:http://blog.csdn.net/hi_kevin/article/details/32316171 HttpClien ...
- HTTPClient 超时链接设置
远程访问链接,设置时间,从而减少不必要的麻烦,但是HttpClient版本不一致,方法不一样,所以有了如下设置 原帖链接:https://www.cnblogs.com/jimmy-muyuan/p/ ...
- HttpClient超时设置
场景:最近并发较高,看到响应时间6s的时候,心里咯噔一下,我记得我设置的超时时间是5s啊. 原来读取超时时间没生效,只生效了连接超时时间. ConnectionPoolTimeoutExcepti ...
- httpclient超时时间设置及代理设置
超时时间 设置HttpClient的超时时间,非常有必要性,因为httpclient 默认超时时间很长,自己可以测试一下是多久,设置超时时间否则会影响自己系统的业务逻辑,例如阻塞系统,影响系统的吞吐量 ...
- HttpClient 超时时间
setSoTimeout(MilSec):连接超时时间.如果在连接过程中有数据传输,超时时间重新计算. setConnectTimeout(MilSec):获取连接超时时间.如果该参数没有设置,那么默 ...
- [Java]使用HttpClient实现一个简单爬虫,抓取煎蛋妹子图
第一篇文章,就从一个简单爬虫开始吧. 这只虫子的功能很简单,抓取到”煎蛋网xxoo”网页(http://jandan.net/ooxx/page-1537),解析出其中的妹子图,保存至本地. 先放结果 ...
随机推荐
- windows/linuxjdk安装,jdk1.6升级到1.7
一.JDK: JAVA_HOME: C:\Program Files\Java\jdk1.7.0_79 PATH: ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin CLASS ...
- 6个最佳的开源Python应用服务器
6个最佳的开源Python应用服务器 首先,你知道什么是应用服务器吗?应用服务器通常被描述为是存在于服务器中心架构中间层的一个软件框架. AD: 首先,你知道什么是应用服务器吗?应用服务器通常被描述为 ...
- Linux 安装Redis全过程日志
wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make ...
- MapReduce/Hbase进阶提升(原理剖析、实战演练)
什么是MapReduce? MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",和他们 ...
- 例解 autoconf 和 automake 生成 Makefile 文件
本文介绍了在 linux 系统中,通过 Gnu autoconf 和 automake 生成 Makefile 的方法.主要探讨了生成 Makefile 的来龙去脉及其机理,接着详细介绍了配置 Con ...
- Codeforces Round #311 (Div. 2)
我仅仅想说还好我没有放弃,还好我坚持下来了. 最终变成蓝名了,或许这对非常多人来说并不算什么.可是对于一个打了这么多场才好不easy加分的人来说,我真的有点激动. 心脏的难受或许有点是由于晚上做题时太 ...
- C#中Base64之编码,解码方法
原文:C#中Base64之编码,解码方法 1.base64 to string string strPath = "aHR0cDovLzIwMy44MS4yOS40Njo1NTU3L1 ...
- javascript json格式解析方法
json.parse用于从一个字符串中解析出json对象 stringify()用于从一个对象解析出字符串 var dataObj = eval("("+json+")& ...
- Oracle实用-01:绑定变量
数据库虽然在学校系统学习过,但是在工作中真正使用起来收获又是不一样的,今天起打算将项目中使用到的技术再分享出来,不以书本的顺序,只从碰到的问题为顺序. 虽然不是纯粹的数据库工程师,但是每个程序员总免不 ...
- 让盘古分词支持最新的Lucene.Net 3.0.3
原文:让盘古分词支持最新的Lucene.Net 3.0.3 好多年没升级过的Lucene.Net最近居然升级了,到了3.0.3后接口发生了很大变化,原来好多分词库都不能用了,所以上次我把MMSeg给修 ...