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超时总结(转)的更多相关文章

  1. httpclient 超时设置

    最近项目客户反应超时经常出现:现已经总结超时设置: 使用是apache的HttpClient: DefaultHttpClient:请求超时httpclient.getParams().setPara ...

  2. Httpclient超时timeout设置

    一:连接超时:connectionTimeout 1:指的是连接一个url的连接等待时间. 二:读取数据超时:soTimeout 1:指的是连接上一个url,获取response的返回等待时间. Fo ...

  3. HttpClient超时设置setConnectionTimeout和setSoTimeout

    http是基于TCP/IP进行通信的,tcp通过3次握手建立连接,并最终以4次挥手终止通信. 知乎上对三次握手和四次挥手有如下解释: 作者:知乎用户链接:https://www.zhihu.com/q ...

  4. httpClient 超时时间设置(转)

    尊重博主原创,特贴博客链接.copy下来只怕以后链接失效或删掉. 转自:http://blog.csdn.net/hi_kevin/article/details/32316171 HttpClien ...

  5. HTTPClient 超时链接设置

    远程访问链接,设置时间,从而减少不必要的麻烦,但是HttpClient版本不一致,方法不一样,所以有了如下设置 原帖链接:https://www.cnblogs.com/jimmy-muyuan/p/ ...

  6. HttpClient超时设置

    场景:最近并发较高,看到响应时间6s的时候,心里咯噔一下,我记得我设置的超时时间是5s啊.   原来读取超时时间没生效,只生效了连接超时时间. ConnectionPoolTimeoutExcepti ...

  7. httpclient超时时间设置及代理设置

    超时时间 设置HttpClient的超时时间,非常有必要性,因为httpclient 默认超时时间很长,自己可以测试一下是多久,设置超时时间否则会影响自己系统的业务逻辑,例如阻塞系统,影响系统的吞吐量 ...

  8. HttpClient 超时时间

    setSoTimeout(MilSec):连接超时时间.如果在连接过程中有数据传输,超时时间重新计算. setConnectTimeout(MilSec):获取连接超时时间.如果该参数没有设置,那么默 ...

  9. [Java]使用HttpClient实现一个简单爬虫,抓取煎蛋妹子图

    第一篇文章,就从一个简单爬虫开始吧. 这只虫子的功能很简单,抓取到”煎蛋网xxoo”网页(http://jandan.net/ooxx/page-1537),解析出其中的妹子图,保存至本地. 先放结果 ...

随机推荐

  1. USB基础简介

    一.USB2.0 Universal Serial Bus (通用串行总线)  符合USB总线数据通信要求的通信协议 1.意义 1.易用(热插拔.即插即用) 2.易扩充(USBHub可同时操作127个 ...

  2. Android 解屏幕锁与点亮屏幕

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  3. iPhone5C三大看点:性能不输iPhone5 或售3399元

    乐杨俊编辑修改转载: iPhone 5C的发售时间或最早在9月18日,抢在中秋节前:最迟至国庆十一假期期间. [IT商业新闻网综合讯](记者 林涛)苹果2013年秋季发布会还有几个小时即将开幕,除了i ...

  4. vim的ex模式用法

    本文出自   http://blog.csdn.net/shuangde800 本文是在学习<使用vi编辑器, Lamb & Robbins编著>时在evernote写的其中一章笔 ...

  5. [Warning] Aborted connection 11203 to db: 'ide' user: 'nuc' host: 'prd01.mb.com' (Got an error writi

    PS:一台物理机扯分了3个虚拟机,一个主db,一个主备,一个从备. 切换到0301的时候 Sep  6 09:16:16 prddb0301 mysqld: 130906  9:16:16 [Warn ...

  6. 基于jquery-easyui的仓库管理系统

    使用jQuery EasyUI创建的仓库管理系统包括系统管理.数据维护.业务单据管理等,有兴趣可以对其进行修改扩展. 数据库采用MYSQL, 帐号/密码:root/root,演示登录帐号/密码:adm ...

  7. 软考之路(四)---软件project一 概念模型,逻辑模型,物理模型

    自从接触到数据库到如今这三个概念大家理解的还有些不清楚,今天来为大家解答疑惑,共同提高,结合生活理解 概念模型        概念模型就是在了解了用户的需求,用户的业务领域工作情况以后,经过分析和总结 ...

  8. Apriori算法实现

    Apriori算法原理:http://blog.csdn.net/kingzone_2008/article/details/8183768 import java.util.HashMap; imp ...

  9. 如何在SAS中重新构建限价指令簿(Limit Order Book):使用HashTable

    在之前的一篇日志里(http://blog.csdn.net/u010501526/article/details/8875446),我将重新构建LOB(Limit Order Book)分为了三步 ...

  10. DFA最小化 -- Hopcroft算法 Python实现

    wiki 伪代码看上去一直以为怪.发现葡萄牙语和俄罗斯语那里的 if 推断都还缺少一个条件. 国内的资料比較少.这几份学习资料不错.比我稀里糊涂的思路要好,分享下: http://www.liafa. ...