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

相關文章
相關標籤/搜索