阿帕奇HttpComponents HttpClient的超时

问题描述 投票:38回答:5

如何设置在httpcomponents的HttpClient连接超时?我发现在文档:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html,但目前尚不清楚这些参数是如何实际设置。

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

java http apache-httpclient-4.x apache-httpcomponents
5个回答
95
投票

在Apache的HTTP客户端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();

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);

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);

版本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);

5
投票

section 2.5你看如何设置CONNECTION_TIMEOUT参数的例子。

CONNECTION_TIMEOUT是等待初始连接的时间和SO_TIMEOUT是您等待建立连接之后读取数据包时的超时。


2
投票

我设置一个硬超时要解决的问题java.net.SocketInputStream.socketRead0整个请求。

private static final ScheduledExecutorService SCHEDULED_EXECUTOR = Executors.newSingleThreadScheduledExecutor()

HttpGet request = new HttpGet("http://www.example.com")
final Runnable delayedTask = new Runnable() {
    @Override
    public void run() {
        request.abort()
    }
}
SCHEDULED_EXECUTOR.schedule(delayedTask, 100000, TimeUnit.MILLISECONDS)
© www.soinside.com 2019 - 2024. All rights reserved.