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. R 分组计算描述性统计量

    统计学区内各个小区的房价均值 数据格式 id|community_name|house_area|house_structure|house_total|house_avg|agency_name|h ...

  2. w3cscholl的在线代码编辑工具2

    https://www.w3cschool.cn/tryrun/runcode?lang=c

  3. Python在VSCode中进入交互界面调试

    VSCode非常强大,断点好用,美中不足,每次只能通过下面窄窄一行进行各种检查,而python的优点就在于交互式的调试,所以希望能够在断点时能够进入到正常的交互界面进行调试. 我用的插件是: 设置交互 ...

  4. 如何用简单例子讲解 Q - learning 的具体过程?

    作者:牛阿链接:https://www.zhihu.com/question/26408259/answer/123230350来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  5. 分布式锁与实现(一)——基于Redis实现(转载)

    php的完整流程,包护队列操作:http://www.cnblogs.com/candychen/p/5736128.html 概述 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致 ...

  6. iOS 8 swift 键盘不出来 ios 8 uitextfield keyboard not appearing

    ios 8 uitextfield keyboard not appearing //发现在iphone 6 and iPhone plus 上面键盘不出来.后来查了下原来要在模拟器里设置下 var ...

  7. 第八周(1) Word信函与邮件

    第八周(1) Word信函与邮件 教学时间 2013-4-15 教学课时 2 教案序号 13 教学目标 1.学会使用word制作信封和标签2.理解邮件合并的概念和功能3.学会利用邮件合并批量制作文档 ...

  8. Mybatis 自动生成代码,数据库postgresql

    最近做了一个项目,使用Mybatis自动生成代码,下面做一下总结,被以后参考: 一.提前准备: 1.工具类:mybatis-generator-core-1.3.2.jar 2.postgresql驱 ...

  9. Python 字典(联合内存、联合数组)

    字典 Python有一个内建数据类型是字典(Dictionaries).字典在某些语言中可能称为“联合内存”("associative memories'')或“联合数组”("as ...

  10. http-server使用

    https://segmentfault.com/q/1010000003926981