Я использую асинхронный клиент HTTP Apache, и мне нужно кое-что изменить.
У меня есть следующий код, но я запутался при настройке RequestConfig и IOReactorConfig, потому что вы можете указать конфигурации таймаутов для них обоих.
Мой вопрос: в чем разница таймаутов между двумя из этих конфигов? Это двойная работа, и я могу просто установить одну из конфигураций? Или таймауты этих двух конфигураций управляют разными вещами?
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(socketTimeout)
.setConnectTimeout(connectionTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.build();
// Create I/O reactor configuration
IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
.setIoThreadCount(Runtime.getRuntime().availableProcessors())
.setConnectTimeout(connectionTimeout)
.setSoTimeout(socketTimeout)
.build();
// Create a custom I/O reactort
ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);
PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor);
cm.setMaxTotal(maxConnTotal);
cm.setDefaultMaxPerRoute(maxConnPerRoute);
HttpAsyncClientBuilder defaultBuilder = HttpAsyncClients.custom()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(cm)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.setRedirectStrategy(new LaxRedirectStrategy());




Параметры реактора ввода / вывода применяются к каналам подключения, управляемым реактором ввода / вывода. Каналы подключения представляют собой двунаправленные потоки данных и не зависят от протокола приложения.
Параметры HTTP-запроса применяются к отдельным HTTP-запросам и управляют тем, как эти запросы выполняются.
Некоторое время назад пользователи просили простой способ переопределить тайм-аут сокета для каждого запроса. В ретроспективе решение о введении такого параметра, вероятно, было ошибкой.
Важное различие между тайм-аутом сокета на уровне канала соединения и тайм-аутом на уровне HTTP заключается в том, что последний применяется только после того, как маршрут HTTP был полностью установлен, процесс, который может включать обновление TLS и промежуточные переходы туннеля прокси, тогда как тайм-аут на уровне канала соединения применяется ко всем вводам / выводам на этом канале немедленно.
Считайте, что IOReactorConfig используется по умолчанию, а RequestConfig - как индивидуальное переопределение.
RequestConfig#socketTimeout был удален в HttpClient 5.0.
не могли бы вы объяснить мне, что такое PoolingNHttpClientConnectionManager, setDefaultMaxPerRoute, setMaxTotal. Я использую их для настройки RestClient в Elasticsearch из-за этой проблемы. Java.io.IOException: существующее соединение было принудительно закрыто удаленным хостом. Правильно ли я поступаю