第一節: HttpClient 連接超時及讀取超時
HttpClient連接超時及讀取超時
httpClient在執行具體http請求時候 有一個連接的時間和讀取內容的時間;
HttpClient連接時間
所謂連接的時候 是HttpClient發送請求的地方開始到連接上目標url主機地址的時間,理論上是距離越短越快,
線路越通暢越快,但是由於路由復雜交錯,往往連接上的時間都不固定,運氣不好連不上,HttpClient的默認連接時間,據我測試,
默認是1分鍾,假如超過1分鍾 過一會繼續嘗試連接,這樣會有一個問題 假如遇到一個url老是連不上,會影響其他線程的線程進去,說難聽點,
就是蹲着茅坑不拉屎。所以我們有必要進行特殊設置,比如設置10秒鍾 假如10秒鍾沒有連接上 我們就報錯,這樣我們就可以進行業務上的處理,
比如我們業務上控制 過會再連接試試看。並且這個特殊url寫到log4j日志里去。方便管理員查看。
HttpClient讀取時間
所謂讀取的時間 是HttpClient已經連接到了目標服務器,然后進行內容數據的獲取,一般情況 讀取數據都是很快速的,
但是假如讀取的數據量大,或者是目標服務器本身的問題(比如讀取數據庫速度慢,並發量大等等..)也會影響讀取時間。
同上,我們還是需要來特殊設置下,比如設置10秒鍾 假如10秒鍾還沒讀取完,就報錯,同上,我們可以業務上處理。
比如我們這里給個地址 http://central.maven.org/maven2/
這個是國外地址 連接時間比較長的,而且讀取的內容多
很容易出現連接超時和讀取超時;
我們如何用代碼實現呢?
HttpClient給我們提供了一個RequestConfig類 專門用於配置參數比如連接時間,讀取時間以及前面講解的代理IP等。
這里給下示例代碼:
1 package com.javaxk.httpclient.chap05; 2 3 import org.apache.http.HttpEntity; 4 import org.apache.http.HttpHost; 5 import org.apache.http.client.config.RequestConfig; 6 import org.apache.http.client.methods.CloseableHttpResponse; 7 import org.apache.http.client.methods.HttpGet; 8 import org.apache.http.impl.client.CloseableHttpClient; 9 import org.apache.http.impl.client.HttpClients; 10 import org.apache.http.util.EntityUtils; 11 12 public class Demo1 { 13 14 public static void main(String[] args)throws Exception { 15 CloseableHttpClient httpClient=HttpClients.createDefault(); // 創建httpClient實例 16 HttpGet httpGet=new HttpGet("http://central.maven.org/maven2/"); // 創建httpget實例 17 RequestConfig config=RequestConfig.custom() 18 .setConnectTimeout(5000) // 設置連接超時時間 5秒鍾 19 .setSocketTimeout(5000) // 設置讀取超時時間5秒鍾 20 .build(); 21 httpGet.setConfig(config); 22 httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0"); 23 CloseableHttpResponse response=httpClient.execute(httpGet); // 執行http get請求 24 HttpEntity entity=response.getEntity(); // 獲取返回實體 25 System.out.println("網頁內容:"+EntityUtils.toString(entity, "utf-8")); // 獲取網頁內容 26 response.close(); // response關閉 27 httpClient.close(); // httpClient關閉 28 } 29 30 }