HttpClient库API跟Lucene同样,每一个版本的API都变化很大,这有点让人头疼。就比如建立一个HttpClient对象吧,每个版本的都不同。 3.X是正常的Java语法 HttpClient httpClient=new DefaultHttpClient(); 4.3变成了工厂模式 CloseableHttpClient httpClient = HttpClients.createDefault();java
超时设置方法apache
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构建,具体的例子以下:socket
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 超时时间,单位毫秒。这个属性是新加的属性,由于目前版本是能够共享链接池的。ui
setSocketTimeout:请求获取数据的超时时间(即响应时间),单位毫秒。 若是访问一个接口,多少时间内没法返回数据,就直接放弃这次调用。url
HttpClient内部有三个超时时间设置:链接池获取可用链接超时,链接超时,读取数据超时.net
先看如下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