オーケストレーションエンジンとしてApacheCamelを使用しています。通常、次のシナリオ:
クライアントはHTTPリクエストを送信します<->CAMELコード<->外部サーバー
クライアントがCAMELコードにHTTPリクエストを送信すると、ボールが転がり始めます。キャメルコードは、RESTHTTP呼び出しを介して外部サーバーをトリガーします。最終的に、キャメルコードはクライアントに返信を送り返します。
応答をクライアントに送り返す前の最後のアクションであるCamelコードは、HTTPGETを外部サーバーに送信します。したがって、最初にTCP接続がセットアップされ、次にデータが送信されます。しばらくすると(これには5〜10秒かかる場合があります)、外部サーバーは200OKで応答します。
問題:Camelは、200 OKを受信した後、TCPFINを外部サーバーに送信しません。その結果、TCP接続は開いたままになります...(外部サーバーは200秒のタイムアウト後にTCP接続自体を閉じますが、これはTCPリソースが200秒の間に失われたことを意味します)。
したがって、TCPレベルでは、次のようになります。
キャメル<---------->外部サーバー
TCP SYN -->
<-- TCP SYN,ACK
TCP ACK -->
HTTP GET -->
<-- 200 OK
TCP ACK -->
<200 seconds later>
<-- TCP FIN,ACK
TCP ACK -->
200 OKを受信した後、CamelにTCP接続を閉じる方法はありますか?
注:「Connection:close」ヘッダーを追加しようとしましたが、Camelはヘッダーを追加しませんでしたか?!それを無視しているようだった...
これは、ヘッダーを追加するためのコードでした。
exchange.getOut().setHeader("Connection","Close");
EclipseIDEを使用するSpringフレームワークでCamel2.9.1を使用しています。