如何在 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);
版本 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);
在第 2.5 节中,您会看到如何设置 CONNECTION_TIMEOUT 参数的示例。
CONNECTION_TIMEOUT 是等待初始连接的时间,SO_TIMEOUT 是您在建立连接后读取数据包时等待的超时时间。
我为整个请求设置了一个硬超时来解决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)