Apache HttpClient 4.4.1 игнорирует время ожидания запроса - PullRequest
0 голосов
/ 27 октября 2018

Мой код Java использует общий Apache HttpClient 4.4.1.Я установил тайм-аут соединения, тайм-аут сокета и тайм-аут запроса на индивидуальный уровень запроса POST равным 100 миллисекундам.Работает нормально большую часть времени.Однако при большом объеме запросов (стресс-тест) HttpClient игнорирует эти тайм-ауты;запросы могут занимать 20 секунд и более.Вот мой код:

private HttpResponse execHttp(HttpRequestBase request, HttpClient client) {
    RequestConfig params = RequestConfig.custom()
               .setConnectTimeout(100)
               .setSocketTimeout(100)
               .setConnectionRequestTimeout(100)
               .build();
    // Set config
    request.setConfig(params);

    // Measure time
    long tStart = System.currentTimeMillis();
    // Execute Http request
    HttpResponse response = client.execute(request);

    // Calculate and print time
    long tDiff = System.currentTimeMillis() - tStart;
    logger.debug(String.format("HTTPCLIENT EXEC TIME:  FROM REQUEST %d / %d / %d MS  ACTUAL %d MS", 
                                    request.getConfig().getSocketTimeout(),
                                    request.getConfig().getConnectTimeout(),                                  
                                    request.getConfig().getConnectionRequestTimeout(),  
                                    tDiff));
    return response;
}

В некоторых случаях я получаю такую ​​запись в журнале:

2018-10-26 14: 18: 45,496 [my-thread-1] DEBUGcom.mypackage.HttpTimeoutTest - HTTPCLIENT EXEC TIME: FROM REQUEST 100/100/100 MS ACTUAL 20044 MS

Чего-нибудь не хватает в коде?Или есть обходной путь, как заставить его всегда применять тайм-аут?

1 Ответ

0 голосов
/ 28 октября 2018

Ничто другое не выделяется с вашим кодом. Если это ошибка в HttpClient, то вы можете попробовать последнюю версию, чтобы увидеть, если это исправить. Если это узкое место, включение «контекстной регистрации» HttpClient может дать некоторое представление.

При этом тайм-аут сокета предназначен только для времени между прибытием пакетов. Таким образом, если вы продолжаете получать пакеты с очень низкой скоростью, тогда общее время запроса может быть намного выше, чем периоды времени ожидания. Если это происходит, то вам нужно создать асинхронную задачу, чтобы прервать запрос с жестким интервалом ожидания.

...