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