我們使用Apache Camel作爲編排引擎。典型地,存在以下情況:Apache Camel:爲什麼在接收200 OK後TCP連接沒有關閉
客戶端發送的HTTP請求< - > CAMEL代碼< - >外部服務器(S)
球啓動時我們的客戶端發送一個HTTP請求到我們的CAMEL代碼滾動。 駱駝代碼將通過REST HTTP調用觸發外部服務器。 最終,駱駝代碼會將回復發送回客戶端。
在將響應發送回客戶端之前的最後一個操作是,駱駝代碼向外部服務器發送HTTP GET。所以首先要設置TCP連接,然後發送數據。一段時間後(這可能需要5到10秒),外部服務器回覆200 OK。
問題:在收到200 OK後,駱駝不會向外部服務器發送TCP FIN。因此,TCP連接保持打開狀態(外部服務器在超過200秒後關閉TCP連接本身,但這意味着在200秒內丟失TCP資源)。
所以,在TCP層,它是這樣的:
駱駝< ---------->外部服務器
TCP SYN -->
<-- TCP SYN,ACK
TCP ACK -->
HTTP GET -->
<-- 200 OK
TCP ACK -->
<200 seconds later>
<-- TCP FIN,ACK
TCP ACK -->
任何想法,我怎麼會有駱駝關閉它已經收到200 OK後的TCP連接?
注:我試着添加「連接:關閉」標題,但駱駝沒有添加標題?!它似乎忽略它...
這是添加頁眉代碼:
exchange.getOut().setHeader("Connection","Close");
我使用駱駝2.9.1與Eclipse IDE的一個Spring框架。
你使用哪一種駱駝http組件? –
嗨,我正在使用駱駝2.9.2(不是2.9.1,正如我前面提到的:()和駱駝 - http-2.9.2.jar(和commons-httpclient-3.1.jar)。 – opstalj
您可以重現此行爲與任何HTTP服務器?或客戶端的服務器是唯一一個不關閉連接? –