日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HttpClient库设置超时

發(fā)布時間:2025/3/15 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HttpClient库设置超时 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

HttpClient庫API跟Lucene一樣,每個版本的API都變化很大,這有點讓人頭疼。就好比創(chuàng)建一個HttpClient對象吧,每一個版本的都不一樣。
3.X是正常的Java語法
HttpClient httpClient=new DefaultHttpClient();
4.3變成了工廠模式
CloseableHttpClient httpClient = HttpClients.createDefault();

超時設(shè)置方法

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);//數(shù)據(jù)傳輸時間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();//設(shè)置請求和傳輸超時時間 httpGet.setConfig(requestConfig); httpClient.execute(httpGet);//執(zhí)行請求

從設(shè)置時間上來看,4.3之前的是一類,都是一個HttpClient綁定好一套配置。
4.3之后,HttpClient不再提供時間配置參數(shù),而是每一種請求對應(yīng)一套配置。

BTW,4.3版本不設(shè)置超時的話,一旦服務(wù)器沒有響應(yīng),等待時間N久(>24小時)。
HttpClient升級到4.5版本后,API有很多變化,HttpClient 4之后,API一直沒有太穩(wěn)定,我感覺4.5版本抽象后,很多API應(yīng)該快穩(wěn)定了。

使用HttpClient,一般都需要設(shè)置連接超時時間和獲取數(shù)據(jù)超時時間。這兩個參數(shù)很重要,目的是為了防止訪問其他http時,由于超時導(dǎo)致自己的應(yīng)用受影響。

4.5版本中,這兩個參數(shù)的設(shè)置都抽象到了RequestConfig中,由相應(yīng)的Builder構(gòu)建,具體的例子如下:

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("得到的結(jié)果:" + response.getStatusLine());//得到請求結(jié)果 HttpEntity entity = response.getEntity();//得到請求回來的數(shù)據(jù)

setConnectTimeout:設(shè)置連接超時時間,單位毫秒。

setConnectionRequestTimeout:設(shè)置從connect Manager(連接池)獲取Connection 超時時間,單位毫秒。這個屬性是新加的屬性,因為目前版本是可以共享連接池的。

setSocketTimeout:請求獲取數(shù)據(jù)的超時時間(即響應(yīng)時間),單位毫秒。 如果訪問一個接口,多少時間內(nèi)無法返回數(shù)據(jù),就直接放棄此次調(diào)用。

HttpClient內(nèi)部有三個超時時間設(shè)置:連接池獲取可用連接超時,連接超時,讀取數(shù)據(jù)超時

先看以下HttpClient的初始化代碼:

RequestConfig requestConfig = RequestConfig.custom() .setConnectionRequestTimeout(config.connReqTimeout) //從連接池中獲取連接的超時時間 //與服務(wù)器連接超時時間:httpclient會創(chuàng)建一個異步線程用以創(chuàng)建socket連接,此處設(shè)置該socket的連接超時時間 .setConnectTimeout(config.connTimeout) .setSocketTimeout(config.socketTimeout) //socket讀數(shù)據(jù)超時時間:從服務(wù)器獲取響應(yīng)數(shù)據(jù)的超時時間 .build(); httpClient = HttpClientBuilder.create() .setMaxConnTotal(config.maxConnTotal) //連接池中最大連接數(shù) /** * 分配給同一個route(路由)最大的并發(fā)連接數(shù)。 * route:運行環(huán)境機器 到 目標(biāo)機器的一條線路。 * 舉例來說,我們使用HttpClient的實現(xiàn)來分別請求 www.baidu.com 的資源和 www.bing.com 的資源那么他就會產(chǎn)生兩個route。 */ .setMaxConnPerRoute(config.maxConnPerRoute) .setDefaultRequestConfig(requestConfig) .build();

三個超時時間詳解:

1.從連接池中獲取可用連接超時
HttpClient中的要用連接時嘗試從連接池中獲取,若是在等待了一定的時間后還沒有獲取到可用連接(比如連接池中沒有空閑連接了)
則會拋出獲取連接超時異常。

2.連接目標(biāo)超時connectionTimeout
指的是連接目標(biāo)url的連接超時時間,即客服端發(fā)送請求到與目標(biāo)url建立起連接的最大時間。如果在該時間范圍內(nèi)還沒有建立起連接,則就
拋出connectionTimeOut異常。如測試的時候,將url改為一個不存在的url:http://test.com ,超時時間3000ms過后,系統(tǒng)報出異常:
org.apache.commons.httpclient.ConnectTimeoutException:The
host did not accept the connection within timeout of 3000 ms

3.等待響應(yīng)超時(讀取數(shù)據(jù)超時)socketTimeout
連接上一個url后,獲取response的返回等待時間 ,即在與目標(biāo)url建立連接后,等待放回response的最大時間,在規(guī)定時間內(nèi)沒有返回響應(yīng)的話就拋出SocketTimeout。
測試的時候的連接url為我本地開啟的一個url,http://localhost:8080/firstTest.htm?method=test,在我這個測試url里,當(dāng)訪問到這個鏈接時,線程sleep一段時間,來模擬返回response超時。
三個超時時間詳解:

1.從連接池中獲取可用連接超時
HttpClient中的要用連接時嘗試從連接池中獲取,若是在等待了一定的時間后還沒有獲取到可用連接(比如連接池中沒有空閑連接了)
則會拋出獲取連接超時異常。

2.連接目標(biāo)超時connectionTimeout
指的是連接目標(biāo)url的連接超時時間,即客服端發(fā)送請求到與目標(biāo)url建立起連接的最大時間。如果在該時間范圍內(nèi)還沒有建立起連接,則就
拋出connectionTimeOut異常。如測試的時候,將url改為一個不存在的url:http://test.com ,超時時間3000ms過后,系統(tǒng)報出異常:
org.apache.commons.httpclient.ConnectTimeoutException:The
host did not accept the connection within timeout of 3000 ms

3.等待響應(yīng)超時(讀取數(shù)據(jù)超時)socketTimeout
連接上一個url后,獲取response的返回等待時間 ,即在與目標(biāo)url建立連接后,等待放回response的最大時間,在規(guī)定時間內(nèi)沒有返回響應(yīng)的話就拋出SocketTimeout。

參考資料

http://blog.csdn.net/u011191463/article/details/78664896

總結(jié)

以上是生活随笔為你收集整理的HttpClient库设置超时的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。