HttpClient库设置超时

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

相关文章
相关标签/搜索