天天看點

HttpClient逾時設定詳解

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