Подтвердить что ты не робот

Apache HttpComponents Время ожидания HttpClient

Как установить тайм-аут соединения в httpcomponents httpclient? Я нашел документацию по адресу http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html, но неясно, как эти параметры действительно установлены.

Также было бы полезно пояснить разницу между SO_TIMEOUT и CONNECTION_TIMEOUT.

4b9b3361

Ответ 1

В версии 4.3 Apache Http Client конфигурация была реорганизована (снова). Новый способ выглядит так:

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

HttpClientBuilder builder = HttpClientBuilder.create();     
builder.setDefaultRequestConfig(requestBuilder.build());
HttpClient client = builder.build();

Ответ 2

Ответ от @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);

Ответ 3

В версии 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);

Ответ 4

В раздел 2.5 вы видите пример того, как установить параметр CONNECTION_TIMEOUT.

CONNECTION_TIMEOUT - это время ожидания первоначального соединения, а SO_TIMEOUT - это таймаут, который вы ждете, когда читаете пакет после установления соединения.

Ответ 5

Я установил жесткий тайм-аут для всего запроса для обхода проблемы 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)