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. 继承Application实现Android数据共享

         Application类 在Android中,启动一个应用,首先会初始化Application,然后再通过它检查AndroidManifest.xml清单文件,选择须要首先启动的Activi ...

  2. 基于W5500+Yeelink的远程灯光控制设计

    概述 工具:物联网云平台Yeelink  DHT11温湿度传感器   W5500EVB 编译环境:Keil4 目的:通过以太网实时监控远程某个位置的温度和湿度 在W5500EVB端连接LED灯.通过W ...

  3. perl 改变对象属性

    [root@wx03 test]# cat Critter.pm package Critter; #unshift(@INC,"/root/test"); #use messag ...

  4. 浅C#中的装箱和拆箱

    1.什么是装箱和拆箱? 简单的来说: 装箱就是值类型转换为引用类型:拆箱就是引用类型转换为值类型 值类型,包括原类型(Sbyte.Byte.Short.Ushort.Int.Uint.Long.Ulo ...

  5. .Net 4.0特性 Tuple元组

    Tuple 字面意思:元组.是.net4.0增加的新特性,是干什么的呢?总结一句,个人觉得这个东西 就是用来在有返回很多种类型的值时可以用到.它提供了8种类型的Tuple,直接看最复杂的那种(其实不是 ...

  6. Delphi XE2 升级项目编译ralease版本,无法添加UAC解决方法

    我今天把一个原来是Delphi2007的工程升级到了Delphi XE2,在编译ralease版本时候,发现无法添加UAC,我觉得可能是升级的原因,随后我用XE2新建了一个工程,但是在编译raleas ...

  7. Spring拦截器中通过request获取到该请求对应Controller中的method对象

    背景:项目使用Spring 3.1.0.RELEASE,从dao到Controller层全部是基于注解配置.我的需求是想在自定义的Spring拦截器中通过request获取到该请求对应于Control ...

  8. Excel单元格内容太多会覆盖遮住下一单元格范围

    Excel单元格内容太多会覆盖遮住下一单元格范围分步阅读 Excel中的单元格内容,有着不同的对齐方式.用户可根据自己的需求,在处理数据的时候,自行设置所需要的对齐方式. 当您在处理数据的时候,如果设 ...

  9. OCA读书笔记(2) - 安装Oracle软件

    Objectives: •Describe your role as a database administrator (DBA) and explain typical tasks and tool ...

  10. Spark SQL Catalyst源代码分析之TreeNode Library

    /** Spark SQL源代码分析系列文章*/ 前几篇文章介绍了Spark SQL的Catalyst的核心执行流程.SqlParser,和Analyzer,本来打算直接写Optimizer的,可是发 ...