HttpClient鏈接超時及讀取超時數據庫
httpClient在執行具體http請求時候 有一個鏈接的時間和讀取內容的時間;apache
HttpClient鏈接時間服務器
所謂鏈接的時候 是HttpClient發送請求的地方開始到鏈接上目標url主機地址的時間,理論上是距離越短越快,併發
線路越通暢越快,可是因爲路由複雜交錯,每每鏈接上的時間都不固定,運氣很差連不上,HttpClient的默認鏈接時間,據我測試,maven
默認是1分鐘,假如超過1分鐘 過一會繼續嘗試鏈接,這樣會有一個問題 假如遇到一個url總是連不上,會影響其餘線程的線程進去,說難聽點,測試
就是蹲着茅坑不拉屎。因此咱們有必要進行特殊設置,好比設置10秒鐘 假如10秒鐘沒有鏈接上 咱們就報錯,這樣咱們就能夠進行業務上的處理,ui
好比咱們業務上控制 過會再鏈接試試看。而且這個特殊url寫到log4j日誌裏去。方便管理員查看。url
HttpClient讀取時間spa
所謂讀取的時間 是HttpClient已經鏈接到了目標服務器,而後進行內容數據的獲取,通常狀況 讀取數據都是很快速的,線程
可是假如讀取的數據量大,或者是目標服務器自己的問題(好比讀取數據庫速度慢,併發量大等等..)也會影響讀取時間。
同上,咱們仍是須要來特殊設置下,好比設置10秒鐘 假如10秒鐘還沒讀取完,就報錯,同上,咱們能夠業務上處理。
好比咱們這裏給個地址 http://central.maven.org/maven2/
這個是國外地址 鏈接時間比較長的,並且讀取的內容多
很容易出現鏈接超時和讀取超時;
咱們如何用代碼實現呢?
HttpClient給咱們提供了一個RequestConfig類 專門用於配置參數好比鏈接時間,讀取時間以及前面講解的代理IP等。
這裏給下示例代碼:
package com.demo.httpclient.chap05; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class Demo2 { public static void main(String[] args)throws Exception { CloseableHttpClient httpClient=HttpClients.createDefault(); // 建立httpClient實例 HttpGet httpGet=new HttpGet("http://central.maven.org/maven2/"); // 建立httpget實例 RequestConfig config=RequestConfig.custom() .setConnectTimeout(5000) .setSocketTimeout(5000) .build(); httpGet.setConfig(config); httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0"); CloseableHttpResponse response=httpClient.execute(httpGet); // 執行http get請求 HttpEntity entity=response.getEntity(); // 獲取返回實體 System.out.println("網頁內容:"+EntityUtils.toString(entity, "utf-8")); // 獲取網頁內容 response.close(); // response關閉 httpClient.close(); // httpClient關閉 } }