HttpClient 4.3。HttpClient這貨和Lucene一樣,每個版本的API都變化很大,這有點讓人頭疼。就好比建立一個HttpClient對象吧,每一個版本的都不一樣。
3.X是這樣的
4.3是這樣的
當然,上面這些變化隻不過是一些小變化,大家看看API大家就都會了。
我要講的是逾時設定,HttpClient有三種逾時設定,最近比較忙,沒時間具體歸納總結,以後再補上,我這裡就講一些最簡單最易用的逾時設定方法。
這是個3.X的逾時設定方法
HttpClient client = newHttpClient();
client.setConnectionTimeout();
client.setTimeout();
HttpClient httpClient= newHttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout();
4.X版本的逾時設定(4.3後已過時)
HttpClient httpClient=newDefaultHttpClient();
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,);//連接配接時間
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,);//資料傳輸時間
4.3版本逾時設定
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet=newHttpGet("http://www.baidu.com");//HTTP Get請求(POST雷同)
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout().setConnectTimeout().build();//設定請求和傳輸逾時時間
httpGet.setConfig(requestConfig);
httpClient.execute(httpGet);//執行請求
BTW,版本不設定逾時的話,一旦伺服器沒有響應,等待時間N久(>小時)。
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().setConnectionRequestTimeout().setSocketTimeout().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)
//socket讀資料逾時時間:從伺服器擷取響應資料的逾時時間
.setSocketTimeout(config.socketTimeout)
.build();
httpClient = HttpClientBuilder.create()
.setMaxConnTotal(config.maxConnTotal)//連接配接池中最大連接配接數
/**
* 配置設定給同一個route(路由)最大的并發連接配接數。
* route:運作環境機器 到 目标機器的一條線路。
* 和 www.bing.com 的資源那麼他就會産生兩個route。
*/
.setMaxConnPerRoute(config.maxConnPerRoute)
.setDefaultRequestConfig(requestConfig)
.build();
三個逾時時間詳解:
1.從連接配接池中擷取可用連接配接逾時
HttpClient中的要用連接配接時嘗試從連接配接池中擷取,若是在等待了一定的時間後還沒有擷取到可用連接配接(比如連接配接池中沒有空閑連接配接了)
則會抛出擷取連接配接逾時異常。
2.連接配接目标逾時connectionTimeout
指的是連接配接目标url的連接配接逾時時間,即客服端發送請求到與目标url建立起連接配接的最大時間。如果在該時間範圍内還沒有建立起連接配接,則就
抛出connectionTimeOut異常。如測試的時候,将url改為一個不存在的url:“http://test.com” ,逾時時間ms過後,系統報出異常:
org.apache.commons.httpclient.ConnectTimeoutException:The
host did not accept the connection within timeout of ms
3.等待響應逾時(讀取資料逾時)socketTimeout
連接配接上一個url後,擷取response的傳回等待時間 ,即在與目标url建立連接配接後,等待放回response的最大時間,在規定時間内沒有傳回響應的話就抛出SocketTimeout。
參考:http://blog.csdn.net/u011191463/article/details/78664896