Apache HttpClient 4.4.1 игнорирует тайм-аут запроса

В моем коде 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] DEBUG com.mypackage.HttpTimeoutTest - HTTPCLIENT EXEC TIME: FROM REQUEST 100 / 100 / 100 MS ACTUAL 20044 MS

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

Ваш код показывает, что вы настраиваете «httpRequestBase», но выполняете «запрос».

Dane White 27.10.2018 00:57

Извините, @DaneWhite пропустил это, когда очищал мой код. Обновлено.

Dmitriy Bannikov 27.10.2018 09:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
415
1

Ответы 1

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

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

Другие вопросы по теме