HttpClient库API跟Lucene一样,每个版本的API都变化很大,这有点让人头疼。就好比创建一个HttpClient对象吧,每一个版本的都不一样。

3.X是正常的Java语法

HttpClient httpClient=new DefaultHttpClient();

4.3变成了工厂模式

CloseableHttpClient httpClient = HttpClients.createDefault();

超时设置方法

3.x
HttpClient client = new HttpClient();
client.setConnectionTimeout(30000);
client.setTimeout(30000); HttpClient httpClient= new HttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000); 4.1
HttpClient httpClient=newDefaultHttpClient();
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,2000);//连接时间
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,2000);//数据传输时间 4.3
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet=newHttpGet("http://www.baidu.com");//HTTP Get请求(POST雷同)
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();//设置请求和传输超时时间
httpGet.setConfig(requestConfig);
httpClient.execute(httpGet);//执行请求

从设置时间上来看,4.3之前的是一类,都是一个HttpClient绑定好一套配置。

4.3之后,HttpClient不再提供时间配置参数,而是每一种请求对应一套配置。

BTW,4.3版本不设置超时的话,一旦服务器没有响应,等待时间N久(>24小时)。

HttpClient升级到4.5版本后,API有很多变化,HttpClient 4之后,API一直没有太稳定,我感觉4.5版本抽象后,很多API应该快稳定了。

使用HttpClient,一般都需要设置连接超时时间和获取数据超时时间。这两个参数很重要,目的是为了防止访问其他http时,由于超时导致自己的应用受影响。

4.5版本中,这两个参数的设置都抽象到了RequestConfig中,由相应的Builder构建,具体的例子如下:

CloseableHttpClient httpclient = HttpClients.createDefault();  

HttpGet httpGet = new HttpGet("http://stackoverflow.com/");  

RequestConfig requestConfig = RequestConfig.custom()  

        .setConnectTimeout(5000).setConnectionRequestTimeout(1000)  

        .setSocketTimeout(5000).build();  

httpGet.setConfig(requestConfig);  

CloseableHttpResponse response = httpclient.execute(httpGet);  

System.out.println("得到的结果:" + response.getStatusLine());//得到请求结果  

HttpEntity entity = response.getEntity();//得到请求回来的数据

setConnectTimeout:设置连接超时时间,单位毫秒。

setConnectionRequestTimeout:设置从connect Manager(连接池)获取Connection 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。

setSocketTimeout:请求获取数据的超时时间(即响应时间),单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。

HttpClient内部有三个超时时间设置:连接池获取可用连接超时,连接超时,读取数据超时

先看以下HttpClient的初始化代码:

RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(config.connReqTimeout) //从连接池中获取连接的超时时间
//与服务器连接超时时间:httpclient会创建一个异步线程用以创建socket连接,此处设置该socket的连接超时时间
.setConnectTimeout(config.connTimeout)
.setSocketTimeout(config.socketTimeout) //socket读数据超时时间:从服务器获取响应数据的超时时间
.build();
httpClient = HttpClientBuilder.create()
.setMaxConnTotal(config.maxConnTotal) //连接池中最大连接数
/**
* 分配给同一个route(路由)最大的并发连接数。
* route:运行环境机器 到 目标机器的一条线路。
* 举例来说,我们使用HttpClient的实现来分别请求 www.baidu.com 的资源和 www.bing.com 的资源那么他就会产生两个route。
*/
.setMaxConnPerRoute(config.maxConnPerRoute)
.setDefaultRequestConfig(requestConfig)
.build();

三个超时时间详解:

1.从连接池中获取可用连接超时

HttpClient中的要用连接时尝试从连接池中获取,若是在等待了一定的时间后还没有获取到可用连接(比如连接池中没有空闲连接了)

则会抛出获取连接超时异常。

2.连接目标超时connectionTimeout

指的是连接目标url的连接超时时间,即客服端发送请求到与目标url建立起连接的最大时间。如果在该时间范围内还没有建立起连接,则就

抛出connectionTimeOut异常。如测试的时候,将url改为一个不存在的url:http://test.com ,超时时间3000ms过后,系统报出异常:

org.apache.commons.httpclient.ConnectTimeoutException:The

host did not accept the connection within timeout of 3000 ms

3.等待响应超时(读取数据超时)socketTimeout

连接上一个url后,获取response的返回等待时间 ,即在与目标url建立连接后,等待放回response的最大时间,在规定时间内没有返回响应的话就抛出SocketTimeout。

测试的时候的连接url为我本地开启的一个url,http://localhost:8080/firstTest.htm?method=test,在我这个测试url里,当访问到这个链接时,线程sleep一段时间,来模拟返回response超时。

三个超时时间详解:

1.从连接池中获取可用连接超时

HttpClient中的要用连接时尝试从连接池中获取,若是在等待了一定的时间后还没有获取到可用连接(比如连接池中没有空闲连接了)

则会抛出获取连接超时异常。

2.连接目标超时connectionTimeout

指的是连接目标url的连接超时时间,即客服端发送请求到与目标url建立起连接的最大时间。如果在该时间范围内还没有建立起连接,则就

抛出connectionTimeOut异常。如测试的时候,将url改为一个不存在的url:http://test.com ,超时时间3000ms过后,系统报出异常:

org.apache.commons.httpclient.ConnectTimeoutException:The

host did not accept the connection within timeout of 3000 ms

3.等待响应超时(读取数据超时)socketTimeout

连接上一个url后,获取response的返回等待时间 ,即在与目标url建立连接后,等待放回response的最大时间,在规定时间内没有返回响应的话就抛出SocketTimeout。

参考资料

http://blog.csdn.net/u011191463/article/details/78664896

HttpClient库设置超时的更多相关文章

  1. HttpClient 如何设置超时时间

    今天分享一个巨坑,就是 HttpClient.这玩意有多坑呢?就是每个版本都变,近日笔者深受其害. 先看一下代码,我要发送请求调用一个c++接口. public static String doPos ...

  2. org.apache.http.client.HttpClient; HttpClient 4.3超时设置

    可用的code import org.apache.commons.lang.StringUtils;import org.apache.http.HttpEntity;import org.apac ...

  3. httpClient创建对象、设置超时

    从老版本和新版本进行比较说明: 1.创建HttpClient对象 3.X: HttpClient httpClient = new DefaultHttpClient(); 4.3: Closeabl ...

  4. android httpclient 设置超时

    3.X是这样的 HttpClient httpClient=new DefaultHttpClient();4.3是这样的CloseableHttpClient httpClient = HttpCl ...

  5. Python3.x:pip命令安装第三方库,超时处理方案

    Python3.x:pip命令安装第三方库,超时处理方案 问题: pip install splinter命令安装第三方库,报超时错误: raise ReadTimeoutError(self._po ...

  6. .net core 下使用StackExchange的Redis库访问超时解决

    原文:.net core 下使用StackExchange的Redis库访问超时解决 目录 问题:并发稍微多的情况下Redis偶尔返回超时 给出了参考网址? 结论 小备注 引用链接 问题:并发稍微多的 ...

  7. CloseableHttpClient设置超时

    Java开发我们常常需要和第三方系统进行通信,通信的方式有多种,如dubbo方式,webservice,微服务和CloseableHttpClient等方式,常涉及到超时问题,这里主要说的是Close ...

  8. Axis2 客户端调用 设置超时时间

    我用的是axis2-1.6.2版本.请看下面的客户端代码: import org.apache.axis2.client.Options; import com.ctis.ta.service.imp ...

  9. 使用timeout-decorator为python函数任务设置超时时间

    需求背景 在python代码的实现中,假如我们有一个需要执行时间跨度非常大的for循环,如果在中间的某处我们需要定时停止这个函数,而不停止整个程序.那么初步的就可以想到两种方案:第一种方案是我们先预估 ...

随机推荐

  1. Java通信过程的中文乱码的解决

    J在基于Java的编程中,常常会碰到汉字的处里及显示的问题.比方一大堆乱码或问号. 这是由于JAVA中默认的编码方式是UNICODE.而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码 ...

  2. Linux下简单线程池的实现

    大多数的网络服务器,包括Web服务器都具有一个特点,就是单位时间内必须处理数目巨大的连接请求,但是处理时间却是比较短的.在传统的多线程服务器模型中是这样实现的:一旦有个服务请求到达,就创建一个新的服务 ...

  3. Netflix推荐系统:从评分预测到消费者法则

    http://in.sdo.com/?p=11 原文链接:Netflix recommendations: beyond the 5 stars (Part 1), (Part 2) 原文作者:Xav ...

  4. svn commit --cl app 时手动输入提交的注释,而不是在 -m 'comments here'这里输入

    原来只需要,提交的时候不指定 -m ,也不指定 -F就可以了,提交之前,svn会自动弹出编辑框来,可以修改信息. https://stackoverflow.com/questions/1746891 ...

  5. SPARK:作业基本运行原理

    Spark作业基本运行原理: 我们使用spark-submit提交一个spark作业之后,这个作业就会启动一个对应的Driver进程.根据你使用的部署模式(deploy-mode)不同:1)Drive ...

  6. ASP.NET MVC 重命名[命名空间]而导致的错误及发现的ASP.NET MVC Bug一枚

    使用VS2012新建了一个Asp.net mvc5的项目,并把项目的命名空间名称更改了(Src更改为UXXXXX),然后就导致了以下错误 刚开始以后是项目的属性中的命名空间没有更改过来的问题,但我在重 ...

  7. Log4net的不能产生Log文件的问题

    [问题] 用如下的步骤应用了Log4Net: 建立了一个公用的项目, 在里面引入了Log4net的Nuget package. 在公用的项目中建立了一个类,加上了Log4net的attribute. ...

  8. A Complete ActiveX Web Control Tutorial

    A Complete ActiveX Web Control Tutorial From: https://www.codeproject.com/Articles/14533/A-Complete- ...

  9. thrift系列 - 快速入门

    1.简介           Thrift是当前流行的RPC框架之一,它有强大的代码生成引擎,可以跨语言,轻松解决程序间的通信问题. 本文旨在帮助大家快速入门,若想深入原理,请参见thrift官网:h ...

  10. Android开发点滴 - 实现层级式导航(API 16+)

    在Jelly Bean(API 16)以前,为了实现顶部的导航菜单,程序员们不得不手工写代码, 神马在OnCreate啊,神马onOptionsItemSelected啊,但是,现在一切都是浮云了. ...