У меня есть два сервера Tomcat, которым необходимо поддерживать постоянное соединение для сокращения SSL-квитирования. Один сервер (прокси-сервер) находится в демилитаризованной зоне, а другой находится в безопасности за другим брандмауэром. Прокси-сервер в основном просто запускает простой сервлет, который выполняет некоторую проверку работоспособности перед отправкой запросов на защищенную машину. По первому требованию машины обмениваются сертификатами перед выполнением реальной работы. Поэтому я хотел бы поддерживать постоянное соединение с таймаутом в несколько минут.
Для связи с защищенным сервером сервлет прокси-сервера использует HttpsUrlConnection
. Я настроил WireShark и заметил, что независимо от значения keepAliveTimeout
, которое я установил для соединителя на защищенной машине, соединение TCP закрывается примерно через 5 или 10 секунд. Похоже, это число совпадает с тем, что я прочитал, по умолчанию, и как Java обрабатывает HTTP Keep-Alive. Эта ссылка объясняет, что Java соблюдает время ожидания Keep-Alive
, если оно отправлено сервером, в противном случае для закрытия соединения используется 5 секунд (прямые подключения) или 10 секунд (прокси-подключения).
Я пытаюсь понять, как заставить Tomcat отправить заголовок Keep-Alive. Не Connection: Keep-Alive
, а Keep-Alive: timeout=x
.
Я экспериментировал с HTTP-сервером Apache, и изменение keepAliveTimeout
в httpd.conf приводит к тому, что заголовок Keep-Alive меняет свое значение тайм-аута. Кроме того, Java соблюдает это время ожидания.
ОБНОВЛЕНИЕ (23.12.11): После нескольких экспериментов я попытался создать быстрый и грязный код, используя Apache HttpClient (3.1) вместо HttpsUrlConnection
. Похоже, что HttpClient, когда он настроен на использование Keep-Alive, просто ждет, пока сервер закроет соединение. Я не знаю, как долго это будет ждать. Я снимаю, чтобы поддерживать HTTP-соединение живым в течение 3-5 минут.