es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Configuración de HttpClient con servidor HTTP Spring Boot (Tomcat)

    He configurado java.net.http.HttpClient para hacer solicitudes GET a un servidor HTTP Spring Boot (Tomcat) que se ejecuta en el puerto 8080. He observado el siguiente comportamiento:

    • Cuando se realiza una solicitud GET desde HttpClient, se crea una conexión TCP para cada solicitud. No hay información sobre keep-alive en los encabezados entrantes.
    • Cuando intento establecer directamente el encabezado keep-alive usando setHeader ("Connection", "Keep-Alive"), obtengo una excepción.
    • Cuando hago una solicitud GET desde un navegador (Safari), el navegador agrega encabezados keep-alive a cada solicitud y solo se crea una conexión TCP para múltiples solicitudes.
    • Cuando establezco la versión en HTTP/2 y realizo la solicitud desde 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.

Comments are closed.