Apache HttpComponents HttpClient timeout
Как установить время ожидания подключения в httpcomponents httpclient? Я нашел документацию по адресу: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html но неясно, как эти параметры фактически устанавливаются.
Кроме того, объяснение разницы между SO_TIMEOUT
а также CONNECTION_TIMEOUT
было бы полезно.
5 ответов
В версии 4.3 Apache Http Client конфигурация была реорганизована (снова). Новый способ выглядит так:
RequestConfig.Builder requestBuilder = RequestConfig.custom();
requestBuilder = requestBuilder.setConnectTimeout(timeout);
requestBuilder = 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)