java - sslcertificatechainfile - tomcat 8 maxthreads default value
Tomcat, HTTP Keep-Alive y Java''s HttpsUrlConnection (3)
En Tomcat logré establecer los encabezados en mi HttpServelet usando HttpServletResponse.addHeader () de esta manera:
response.addHeader("Connection", "Keep-Alive");
response.addHeader("Keep-Alive", "timeout=60000");
Confirmé con WireShark que esto funciona con HttpUrlConnection en el lado del cliente. No funciona si no configura el encabezado "Conexión", por lo que necesita configurar ambos.
Tengo dos servidores Tomcat que necesitan mantener una conexión persistente para reducir el protocolo SSL. Un servidor (el proxy) se encuentra en una DMZ, mientras que el otro está seguro detrás de otro firewall. Básicamente, el proxy solo ejecuta un servlet simple que realiza algunas comprobaciones antes de reenviar las solicitudes a la máquina segura. En una solicitud inicial, las máquinas intercambian certificados antes de realizar el trabajo real. Por lo tanto, me gustaría mantener una conexión persistente con un tiempo de espera de unos minutos.
Para hablar con el servidor seguro, el servlet en el proxy utiliza HttpsUrlConnection
. He configurado WireShark y he notado que no importa el valor de keepAliveTimeout
que configuré para el conector en la máquina segura, la conexión TCP se cierra después de unos 5 o 10 segundos. Este número parece coincidir con lo que he leído: el tiempo de espera predeterminado y la forma en que Java maneja HTTP Keep-Alive. Este link explica que Java respeta el tiempo de espera de Keep-Alive
si lo envía el servidor; de lo contrario, utiliza 5 segundos (conexiones directas) o 10 segundos (conexiones proxy) antes de cerrar la conexión.
Lo que estoy tratando de averiguar es cómo puedo obligar a Tomcat a enviar el encabezado Keep-Alive. No, Connection: Keep-Alive
, pero Keep-Alive: timeout=x
.
He experimentado con el servidor HTTP Apache y la modificación de keepAliveTimeout
en httpd.conf hace que el encabezado Keep-Alive cambie su valor de tiempo de espera. Además, Java hace honor a este tiempo fuera.
ACTUALIZACIÓN (12/23/11): Después de ejecutar algunos experimentos más, intenté crear un código rápido y sucio usando HttpClient (3.1) de HttpsUrlConnection
lugar de HttpsUrlConnection
. Parece que HttpClient, cuando está configurado para usar Keep-Alive, simplemente espera que el servidor cierre la conexión. Aunque no sé cuánto tiempo esperará. Estoy disparando para mantener viva la conexión HTTP durante 3 a 5 minutos.
Java API Http(s)UrlConnection
respeta a la perfección la información Keep-Alive
y administra un conjunto de conexiones por servidor host de acuerdo con la siguiente explicación detallada (lea atentamente cada detalle es importante).
En ese caso, su código debe leer completamente los búferes, cerrar flujos y leer el error en caso de IOException
.
Por supuesto, HttpClient tiene menos restricciones, pero la mejor manera de manejar su situación es usar su MultiThreadedHttpConnectionManager
gracias a las siguientes pautas .
Pude usar HttpClient 3.1 para mantener abierta la conexión HTTP durante 5 minutos configurando keepAliveTimeout en el conector Tomcat a 300000. Lo verifiqué usando WireShark que el servidor terminará la conexión mientras que HttpClient simplemente esperará. Las solicitudes posteriores a través de HttpClient reutilizan la conexión TCP existente (evitando cualquier otro protocolo de SSL). Sin embargo, la clave es tener una sola instancia de HttpClient (es decir, no crear una cada vez). Esto puede ser obvio para la mayoría, pero no estaba seguro de cuáles serían los mecanismos API para HTTPClient. En resumen, cree una instancia de HttpClient y para cada solicitud (POST, GET, etc.) cree un nuevo PostMethod, GetMethod, etc. Esto hará que la conexión TCP se reutilice.