У меня есть два сервера Tomcat, которым необходимо поддерживать постоянное соединение, чтобы сократить связь с SSL-связью. Один сервер (прокси) находится в DMZ, а другой - за другим брандмауэром. Прокси-сервер в основном просто запускает простой сервлет, который выполняет некоторую проверку работоспособности перед отправкой запросов на защищенную машину. По внутреннему запросу машины обмениваются сертификатами перед выполнением реальной работы. Поэтому я хотел бы поддерживать постоянную связь с таймаутом в несколько минут.
Чтобы поговорить с защищенным сервером, сервлет в прокси использует 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 выполняет этот тайм-аут.
ОБНОВЛЕНИЕ (12/23/11):. После нескольких экспериментов я попытался взломать какой-то быстрый и грязный код, используя Apache HttpClient (3.1), а не HttpsUrlConnection
. Похоже, что HttpClient, когда он настроен на использование Keep-Alive, просто ждет завершения соединения с сервером. Я не знаю, как долго он будет ждать. Я снимаю, чтобы поддерживать HTTP-соединение в течение 3 - 5 минут.