1.問題如下:
前端有個加載提示框, 服務端進行Http請求獲取數據, 查詢慢等原因造成沒有響應, 使兩端都處於等待狀態, 用戶體驗感很差.
2.解決: ( 設置超時 )
使用RequestConfig對象, 由相應的Builder構建.
HttpGet httpget = new HttpGet(url);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(3000) //連接超時.
.setConnectionRequestTimeout(3000) //從連接池中獲取可用連接超時.
.setSocketTimeout(3000) //讀取超時.
.build(); //構建RequestConfig對象.
httpget.setConfig(requestConfig);
HttpClient httpClient = HttpClients.createDefault();
HttpResponse response = httpClient.execute(httpget);
3.方法詳解. ( 參數: 單位(ms) )
1.setConnectTimeout:設置連接超時時間!
指的是連接目標url的連接超時時間,即發送請求到與目標url建立起連接的最大時間。如果在該時間範圍內還沒有建立起連接,則就拋出connectionTimeOut異常。
Caused by: java.net.SocketTimeoutException: connect timed out
2.setSocketTimeout:設置請求獲取數據(響應)的超時時間.
連接上一個url後,獲取response的返回等待時間 ,即在與目標url建立連接後,等待放回response的最大時間,在規定時間內沒有返回響應的話就拋出read time out。
Caused by: java.net.SocketTimeoutException: Read timed out
3.setConnectionRequestTimeout:設置從connect Manager獲取Connection 超時時間.
HttpClient中的要用連接時嘗試從連接池中獲取,若是在等待了一定的時間後還沒有獲取到可用連接(比如連接池中沒有空閒連接了) , 則會拋出獲取連接超時異常。
4.總結
因此使用HttpClient,一般都需要設置連接超時時間和獲取數據超時時間。這兩個參數很重要,目的是爲了防止訪問其他http時,由於超時導致自己的應用受影響。
可參考: https://blog.csdn.net/chyercn/article/details/97273357