Разница между настройками времени ожидания на RequestConfig и IOReactorConfig? - PullRequest
0 голосов
/ 30 апреля 2018

Я использую асинхронный клиент Apache HTTP, и у меня есть некоторые конфигурации по этому поводу.

У меня есть следующий код, но я не совсем понимаю, когда устанавливаю RequestConfig и IOReactorConfig, потому что вы можете указать оба тайм-аута.

Мой вопрос: какова разница времени ожидания между этими двумя конфигами? Это двойная работа, и я могу просто установить один из Config? Или тайм-ауты этих двух конфигов контролируют разные вещи?

    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());

1 Ответ

0 голосов
/ 01 мая 2018

Параметры реактора ввода / вывода применяются к каналам подключения, управляемым реактором ввода / вывода. Каналы подключения представляют собой двунаправленные потоки данных и не зависят от протокола приложения.

Параметры HTTP-запроса применяются к отдельным HTTP-запросам и контролируют выполнение этих запросов.

Некоторое время назад пользователи просили о простом способе переопределения времени ожидания сокета для каждого запроса. В ретроспективе решение о введении такого параметра, скорее всего, было ошибкой.

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

Думайте о IOReactorConfig как о значении по умолчанию и RequestConfig как о переопределении в каждом конкретном случае.

RequestConfig#socketTimeout был удален в HttpClient 5.0

...