В моем коде 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
В коде чего-то не хватает? Или есть какое-то обходное решение, как заставить его всегда применять тайм-аут?
Извините, @DaneWhite пропустил это, когда очищал мой код. Обновлено.
Ничто другое в вашем коде не выделяется. Если это ошибка HttpClient, вы можете попробовать последнюю версию, чтобы узнать, устраняет ли она ее. Если это узкое место, то включение «ведения журнала контекста» HttpClient может дать некоторое представление.
При этом тайм-аут сокета предназначен только для времени между прибытием пакетов. Таким образом, если вы продолжаете получать пакеты с очень низкой скоростью, тогда ваше общее время запроса может легко быть намного больше, чем ваши периоды тайм-аута. Если это происходит, вам нужно будет создать асинхронную задачу, чтобы прервать запрос с жестким интервалом тайм-аута.
Ваш код показывает, что вы настраиваете «httpRequestBase», но выполняете «запрос».