Estamos utilizando Apache Camel como motor de orquestación. Por lo general, el siguiente escenario:Apache Camel: por qué la conexión TCP no está cerrada después de recibir 200 OK
cliente envía la solicitud HTTP < -> código de CAMEL < -> servidor externo (s)
La pelota comienza a rodar cuando nuestro cliente envía una solicitud HTTP a nuestro código CAMEL. El código Camel activará servidores externos a través de llamadas HTTP REST. Eventualmente, el código de Camel enviará una respuesta al cliente.
La última acción antes de devolver la respuesta al cliente, el código Camel envía un HTTP GET hacia un servidor externo. Entonces, primero se configura una conexión TCP y luego se envían los datos. Después de un tiempo (esto puede tomar de 5 a 10 segundos), el servidor externo responde con un 200 OK.
Problema: Camel no envía un TCP FIN al servidor externo después de recibir el 200 OK. Como resultado, la conexión TCP permanece abierta ... (el servidor externo luego cierra la conexión TCP después de un tiempo de espera de 200 segundos, pero esto significa que se perdió un recurso TCP durante 200 segundos).
Así, a nivel TCP, es la siguiente:
Camel < ----------> servidor externo
TCP SYN -->
<-- TCP SYN,ACK
TCP ACK -->
HTTP GET -->
<-- 200 OK
TCP ACK -->
<200 seconds later>
<-- TCP FIN,ACK
TCP ACK -->
Alguna idea de cómo puedo tener Camel cerrar la Conexión TCP después de haber recibido el 200 OK?
Nota: Intenté agregar el encabezado "Connection: close", pero Camel no agregó el encabezado?! Parecía ignorarlo ...
Este era el código para agregar el encabezado:
exchange.getOut().setHeader("Connection","Close");
estoy usando Camel 2.9.1 en un marco de primavera con Eclipse IDE.
¿Qué componente de Camels http usas? –
Hola, estoy usando Camel 2.9.2 (no 2.9.1 como mencioné antes :() y camel-http-2.9.2.jar (y commons-httpclient-3.1.jar). – opstalj
¿Puede reproducir este comportamiento con ¿Algún servidor HTTP? ¿O el servidor del cliente es el único que no cierra la conexión? –