Apache HttpComponents HttpClient超时

Lan*_*uhn 43 java http apache-httpcomponents apache-httpclient-4.x

如何在httpcomponents httpclient中设置连接超时?我在http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html找到了文档,但不清楚这些参数是如何实际设置的.

此外,之间的区别的解释SO_TIMEOUTCONNECTION_TIMEOUT将是有益的.

30t*_*thh 95

在Apache Http Client的4.3版中,配置被重构(再次).新方式如下:

RequestConfig.Builder requestBuilder = RequestConfig.custom();
requestBuilder.setConnectTimeout(timeout);
requestBuilder.setConnectionRequestTimeout(timeout);

HttpClientBuilder builder = HttpClientBuilder.create();     
builder.setDefaultRequestConfig(requestBuilder.build());
HttpClient client = builder.build();
Run Code Online (Sandbox Code Playgroud)

  • 你需要添加`requestBuilder.setSocketTimeout(timeout);`.请注意,`timeout`应该是毫秒! (8认同)
  • 此外,Builder允许您链接这些语句以获得更简单的代码:`RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout).setSocketTimeout(timeout).build();` (7认同)
  • 请注意,调用`setConnectTimeout()`和[`setConnectionRequestTimeout()`](http://stackoverflow.com/questions/20271017/connection-and-connection-request-timeout#comment30255182_20271424)与**不同**设置`CONNECTION_TIMEOUT`和`SO_TIMEOUT`(如问题所示).你可能想要`setConnectTimeout()`和`setSocketTimeout()`. (6认同)

MAD*_*N M 10

在HttpClient 4.3版本中,您可以使用以下示例..让我们说5秒钟

int timeout = 5;
RequestConfig config = RequestConfig.custom()
  .setConnectTimeout(timeout * 1000)
  .setConnectionRequestTimeout(timeout * 1000)
  .setSocketTimeout(timeout * 1000).build();
CloseableHttpClient client = 
  HttpClientBuilder.create().setDefaultRequestConfig(config).build();
HttpGet request = new HttpGet("http://localhost:8080/service"); // GET Request
response = client.execute(request);
Run Code Online (Sandbox Code Playgroud)


quu*_*x00 9

来自@jontro的答案是正确的,但是如果有一个代码片段就可以了解如何做到这一点总是很好的.有两种方法可以做到这一点:

版本1:为每个参数设置10秒超时:

HttpClient httpclient = new DefaultHttpClient();
// this one causes a timeout if a connection is established but there is 
// no response within 10 seconds
httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10 * 1000);

// this one causes a timeout if no connection is established within 10 seconds
httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10 * 1000);

// now do the execute:
HttpGet httpget = new HttpGet(URL);
HttpResponse response = httpclient.execute(httpget);
Run Code Online (Sandbox Code Playgroud)



版本2:还为每个参数设置10秒超时:

HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 10 * 1000);
HttpConnectionParams.setSoTimeout(params, 10 * 1000);

HttpClient httpclient = new DefaultHttpClient(params);
HttpGet httpget = new HttpGet(URL);
HttpResponse response = httpclient.execute(httpget);
Run Code Online (Sandbox Code Playgroud)


jon*_*tro 5

2.5节中,您将看到一个有关如何设置CONNECTION_TIMEOUT参数的示例。

CONNECTION_TIMEOUT是等待初始连接的时间,而SO_TIMEOUT是在建立连接后读取数据包时等待的超时。