Клиент apache camel https4 не использует один и тот же порт tcp для нескольких запросов с keepalive = true

Привет, я использую Apache camel компонент http4 для отправки запроса https с keepAlive=true, но когда я вижу netstat после отправки нескольких запросов, я вижу, что каждый запрос открывает новый Порт TCP для однорангового узла. Я считаю, что это не должно быть обычным поведением keepAlive транзакции, почему тот же порт TCP не является повторно использованный для связи с сервером и как этого можно достичь, если это вообще возможно.

Добавьте код, показывающий, как вы настроили keepAlive, потому что в текущих документах нет опции keepAlive=true для компонента HTTP4.

Bedla 31.10.2018 20:36

Я использую компонент http4, а затем вызываю URL-адрес с помощью компонента http4 с keepAlive = true в качестве заголовка запроса. Ниже показан код. <bean id = "https4rtti" class = "org.apache.camel.component.http4.HttpComponent" init-method = "start" destroy-method = "stop"> <property name = "sslContextParameters" ref = "sslContextParameters" / > <property name = "connectionsPerRoute" value = "$ {perseus.connectionsPerRoute}" /> <property name = "maxTotalConnections" value = "$ {perseus.maxTotalConnections}" /> </bean> https4rtti: // someHostName / res ? keepAlive = истина

Atish Agrawal 02.11.2018 07:40

когда я проверяю netstat на адрес назначения, я вижу каждый раз, когда устанавливается новое соединение TCP-порта, из которого через несколько секунд статус меняется на CLOSE_WAIT.

Atish Agrawal 02.11.2018 07:43
0
3
531
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы уже анализировали Заголовки ответа HTTP, чтобы проверить, учитывается ли KeepAlive и с каким значением тайм-аута.

Пример ожидаемого ответа:

HTTP/1.1 200 OK
Connection: Keep-Alive
Keep-Alive: timeout=10, max=20
Content-Type: text/html; charset=UTF-8
Date: ...
Content-Length: ...

content-type application / xml connection keep-alive content-length 258 # status # HTTP / 1.1 200 OK

Atish Agrawal 02.11.2018 12:12

Да, заголовки ответов, которые я проверил, приведены выше. Они содержат живое существо

Atish Agrawal 02.11.2018 12:13
Ответ принят как подходящий

Оказывается, это не проблема сохранения активности; соединения фактически поддерживаются должным образом. Проблема в том, что соединения как часть пула, управляемого по умолчанию PoolingHttpClientConnectionManager, не использовались повторно. Обе вещи можно было легко увидеть, включив ведение журнала для Apache HttpClient (который используется под капотом):

Keep-Alive используется:

2018/12/19 07: 59: 17: 470 CET [DEBUG] провод - http-outgoing-7 << "HTTP / 1.1 200 OK [\ r] [\ n]" 2018/12/19 07: 59: 17: 470 CET [DEBUG] провод - http-outgoing-7 << "Keep-Alive: timeout = 5, max = 300 [\ r] [\ n]" 2018/12/19 07: 59: 17: 470 CET [DEBUG] провод - http-outgoing-7 << "Сервер: Apache-Coyote / 1.1 [\ r] [\ n]" 2018/12/19 07: 59: 17: 470 CET [DEBUG] провод - http-outgoing-7 << "Content-Encoding: gzip [\ r] [\ n]" 2018/12/19 07: 59: 17: 470 CET [DEBUG] провод - http-outgoing-7 << "Vary: Accept-Encoding [\ r] [\ n]" 2018/12/19 07: 59: 17: 470 CET [DEBUG] провод - http-outgoing-7 << "Cluster-Id: A [\ r] [\ n]" 2018/12/19 07: 59: 17: 470 CET [DEBUG] wire - http-outgoing-7 << "Дата: среда, 19 декабря 2018 г. 06:59:17 GMT [\ r] [\ n]" 2018/12/19 07: 59: 17: 470 CET [DEBUG] провод - http-outgoing-7 << "Content-Type: text / xml [\ r] [\ n]" 2018/12/19 07: 59: 17: 471 CET [DEBUG] провод - http-outgoing-7 << "Content-Length: 239 [\ r] [\ n]" 2018/12/19 07: 59: 17: 471 CET [DEBUG] провод - http-outgoing-7 << "[\ r] [\ n]" Подключения не используются повторно:

2018/12/19 08: 00: 08: 240 CET [DEBUG] PoolingHttpClientConnectionManager - Запрос на соединение: [маршрут: {s} -> https://someurl.com:443 impression[total поддерживается: 1; выделен маршрут: 1 из 1; всего выделено: 1 из 1] 2018/12/19 08: 00: 08: 240 CET [DEBUG] DefaultManagedHttpClientConnection - http-outgoing-7: закрыть соединение 2018/12/19 08: 00: 08: 242 CET [DEBUG] PoolingHttpClientConnectionManager - Соединение арендовано: [id: 8] [маршрут: {s} -> https://someurl.com:443 impression[total поддерживается: 0; выделен маршрут: 1 из 1; всего выделено: 1 из 1] Обратите внимание, что можно легко включить ведение журнала для HttpClient, передав некоторые аргументы JVM при запуске.

Итак, почему же тогда соединения не используются повторно? Это связано с тем, что используется SSL, а PoolingHttpClientConnectionManager, используемый Apache HttpClient, не позволяет повторно использовать соединение в случае, если участник пользователя из существующего соединения отличается от запрошенного соединения (с помощью DefaultUserTokenHandler). См. Также, например, это сообщение Stackoverflow. Решение состоит в том, чтобы реализовать собственный UserTokenHandler (или использовать NullTokenHandler, если этого достаточно) и соответствующим образом настроить HttpClientBuilder.

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