1. 程式人生 > >HttpClient的三個超時時間

HttpClient的三個超時時間

一、先列出問題
setConnectTimeout:設定連線超時時間,單位毫秒。
setConnectionRequestTimeout:設定從connect Manager獲取Connection 超時時間,單位毫秒。這個屬性是新加的屬性,因為目前版本是可以共享連線池的。
setSocketTimeout:請求獲取資料的超時時間,單位毫秒。 如果訪問一個介面,多少時間內無法返回資料,就直接放棄此次呼叫。
二、類所屬包
httpcomponents-client-4.5.5-bin.zip
這是java中apache對於http程式設計的包
三、具體程式碼
使用HttpClient,一般都需要設定連線超時時間和獲取資料超時時間。這兩個引數很重要,目的是為了防止訪問其他http時,由於超時導致自己的應用受影響。
4.5版本中,這兩個引數的設定都抽象到了RequestConfig中,由相應的Builder構建。

package network;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
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 HttpClientTest { public static void main(String[] args) { CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet("http://www.google.com"
); RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(1000) .setSocketTimeout(5000).build(); httpGet.setConfig(requestConfig); CloseableHttpResponse response = null; try { response = httpclient.execute(httpGet); } catch (IOException e) { e.printStackTrace(); } System.out.println("得到的結果:" + response.getStatusLine());// 得到請求結果 HttpEntity entity = response.getEntity();// 得到請求回來的資料 String s = ""; try { s = EntityUtils.toString(response.getEntity(), "UTF-8"); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(s); } }

一、連線超時:connectionTimeout
指的是連線一個url的連線等待時間。比如連google.

五月 31, 2018 6:00:03 下午 org.apache.http.impl.execchain.RetryExec execute
資訊: I/O exception (java.net.SocketException) caught when processing request to {}->http://www.google.com:80: Network is unreachable: connect
五月 31, 2018 6:00:03 下午 org.apache.http.impl.execchain.RetryExec execute
資訊: Retrying request to {}->http://www.google.com:80
五月 31, 2018 6:00:08 下午 org.apache.http.impl.execchain.RetryExec execute
資訊: I/O exception (java.net.SocketException) caught when processing request to {}->http://www.google.com:80: Network is unreachable: connect
五月 31, 2018 6:00:08 下午 org.apache.http.impl.execchain.RetryExec execute
資訊: Retrying request to {}->http://www.google.com:80
五月 31, 2018 6:00:13 下午 org.apache.http.impl.execchain.RetryExec execute
資訊: I/O exception (java.net.SocketException) caught when processing request to {}->http://www.google.com:80: Network is unreachable: connect
五月 31, 2018 6:00:13 下午 org.apache.http.impl.execchain.RetryExec execute
資訊: Retrying request to {}->http://www.google.com:80
java.net.SocketException: Network is unreachable: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:373)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    at network.HttpClientTest.main(HttpClientTest.java:25)
Exception in thread "main" java.lang.NullPointerException
    at network.HttpClientTest.main(HttpClientTest.java:29)

二、測試超時
指的是連線上一個url,獲取response的返回等待時間。
測試的時候連線url可以是本地開啟的一個url,http://localhost:8080/firstTest.htm?method=test
當訪問到這個連結時,執行緒sleep一段時間,來模擬返回response超時。

@RequestMapping(params = "method=test")
public String testMethod(ModelMap model) {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("call testMethod method.");
    model.addAttribute("name", "test method");
    return "test";
}