我该如何在httpcomponents httpclient中设置连接超时? 我已经找到了文档:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html,但这些参数的实际设置方式并不清楚。
此外,解释一下SO_TIMEOUT
和CONNECTION_TIMEOUT
之间的区别将会很有帮助。
我该如何在httpcomponents httpclient中设置连接超时? 我已经找到了文档:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html,但这些参数的实际设置方式并不清楚。
此外,解释一下SO_TIMEOUT
和CONNECTION_TIMEOUT
之间的区别将会很有帮助。
在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();
在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);
@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);
第二版: 同时为这些参数设置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);
.getParams()
现在已经被弃用并抛出UnsupportedOperationException
异常。 - user177800我为整个请求设置了一个严格的时间限制,以解决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)
requestBuilder.setSocketTimeout(timeout);
。请注意,timeout
应该是毫秒为单位的! - StefansetConnectTimeout()
和setConnectionRequestTimeout()
与设置CONNECTION_TIMEOUT
和SO_TIMEOUT
(如所述问题中)不同。您可能需要使用setConnectTimeout()
和setSocketTimeout()
。 - JonikRequestConfig config = RequestConfig.custom().setConnectTimeout(timeout).setSocketTimeout(timeout).build();
- JonikRequestConfig.custom().setConnectionTimeout(timeout).setConnectionRequestTimeout(timeout).build()
就能构建你所需的 RequestConfig。同样适用于 HttpClient 的构建… - Peter Perháč