Java HttpClient no mantiene la conexión TCP activa con la versión HTTP/1.1.
Configuré java.net.http.HttpClient
de la siguiente manera:
java
HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
Además, tengo un servidor Spring Boot (Tomcat)
HTTP simple que se está ejecutando en el puerto 8080
. Para cada solicitud, verifico los encabezados entrantes en un controlador y el número de conexiones TCP
utilizando el siguiente comando: lsof -i -P | grep "TCP" | grep "8080"
.
1. Cuando hago una solicitud GET
desde client
, se crea exactamente una conexión TCP
para cada solicitud. Los encabezados entrantes no tienen ninguna información sobre keep-alive
.
2. Cuando intento establecer directamente el encabezado keep-alive
, obtengo la siguiente excepción.
HttpRequest req = HttpRequest.newBuilder()
.setHeader("Connection", "Keep-Alive")
.uri(uri)
.build();
3. Cuando hago una solicitud GET
desde un navegador (Safari)
, el navegador agrega encabezados keep-alive
a cada solicitud y se crea solo una conexión TCP
para varias solicitudes (como se esperaba).
4. Cuando establezco la versión HTTP/2 y hago la solicitud desde el cliente, se crea solo una conexión TCP
para todas las solicitudes (como se esperaba):
java
HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2).build();
Como se describe aquí, tanto HTTP/1.1 como HTTP/2 tienen la propiedad keep-alive
que está habilitada de forma predeterminada, pero como se puede ver en los ejemplos anteriores, no funciona para HTTP/1.1 en mi caso.
¿Alguien sabe cómo configurar correctamente HttpClient
? ¿O tal vez estoy haciendo algo mal?
davy.ai
Configuración de HttpClient con servidor HTTP Spring Boot (Tomcat)
He configurado
java.net.http.HttpClient
para hacer solicitudesGET
a un servidor HTTP Spring Boot (Tomcat) que se ejecuta en el puerto8080
. He observado el siguiente comportamiento:GET
desdeHttpClient
, se crea una conexión TCP para cada solicitud. No hay información sobrekeep-alive
en los encabezados entrantes.keep-alive
usandosetHeader ("Connection", "Keep-Alive")
, obtengo una excepción.GET
desde un navegador (Safari), el navegador agrega encabezadoskeep-alive
a cada solicitud y solo se crea una conexión TCP para múltiples solicitudes.HttpClient
, solo se crea una conexión TCP para todas las solicitudes.Según la documentación, tanto HTTP/1.1 como HTTP/2 tienen la propiedad
keep-alive
habilitada de forma predeterminada. Sin embargo, en mi caso, no funciona para HTTP/1.1.Estoy buscando sugerencias sobre cómo configurar correctamente
HttpClient
o si hay algo incorrecto en mi enfoque.