Usiamo Apache Camel come motore di orchestrazione. In genere, il seguente scenario:Apache Camel: perché la connessione TCP non è chiusa dopo aver ricevuto 200 OK
client invia richiesta HTTP < -> codice CAMEL < -> server esterni (s)
La palla inizia a rotolare quando il nostro client invia una richiesta HTTP al nostro codice CAMEL. Il codice Camel attiverà server esterni tramite le chiamate HTTP REST. Alla fine, il codice Camel invierà una risposta al cliente.
L'ultima azione prima di inviare la risposta al client, il codice Camel invia un GET HTTP verso un server esterno. Quindi viene prima impostata una connessione TCP, quindi i dati inviati. Dopo un po 'di tempo (questo potrebbe richiedere da 5 a 10 secondi), il server esterno risponde con 200 OK.
Problema: Camel non invia TCP FIN al server esterno dopo aver ricevuto 200 OK. Di conseguenza, la connessione TCP rimane aperta ... (il server esterno chiude quindi la connessione TCP stessa dopo un timeout di 200 secondi, ma ciò significa che una risorsa TCP viene persa durante 200 secondi).
Quindi, a livello TCP, va in questo modo:
Camel < ----------> server esterni
TCP SYN -->
<-- TCP SYN,ACK
TCP ACK -->
HTTP GET -->
<-- 200 OK
TCP ACK -->
<200 seconds later>
<-- TCP FIN,ACK
TCP ACK -->
Qualsiasi idea di come posso avere Camel chiudere il Connessione TCP dopo aver ricevuto il 200 OK?
Nota: ho provato ad aggiungere l'intestazione "Connessione: chiusa", ma Camel non ha aggiunto l'intestazione?! Sembrava di ignorarlo ...
questo era il codice per aggiungere l'intestazione:
exchange.getOut().setHeader("Connection","Close");
Sto usando Camel 2.9.1 in un quadro primavera con Eclipse IDE.
Quale componente http Camels usi? –
Ciao, sto usando Camel 2.9.2 (non 2.9.1 come ho detto prima :() e camel-http-2.9.2.jar (e commons-httpclient-3.1.jar). – opstalj
Puoi riprodurre questo comportamento con qualsiasi server HTTP? O il server del client è l'unico che non chiude la connessione? –