私たちはApache Camelをオーケストレーションエンジンとして使用しています。一般的に、次のシナリオ:ボールは、私たちのクライアントは、私たちのCAMELコードにHTTPリクエストを送信するときにロールを開始>外部サーバ(群)Apache Camel:200を受信した後TCP接続が閉じない理由
- - > CAMELコード<
クライアントは、HTTPリクエスト<を送信します。 Camelコードは、REST HTTP呼び出しを介して外部サーバーをトリガーします。 最終的に、Camelコードはクライアントに返信を返します。
クライアントに応答を返す前の最後のアクションで、Camelコードは外部サーバーに対してHTTP GETを送信します。したがって、TCP接続が最初に設定され、次にデータが送信されます。しばらくすると(これは5〜10秒かかる)、外部サーバーは200 OKで応答します。
問題:Camelは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接続?
注:「Connection:close」ヘッダーを追加しようとしましたが、Camelはヘッダーを追加しませんでしたか。ヘッダーを追加するためのコードだった
...それを無視するように見えた:
exchange.getOut().setHeader("Connection","Close");
私は、Eclipse IDEでSpringフレームワークでキャメル2.9.1を使用しています。
あなたはCamelsのhttpコンポーネントを使いますか? –
こんにちは、私はCamel 2.9.2を使用しています(2.9.1ではなく、前述の:()とcamel-http-2.9.2.jar(とcommons-httpclient-3.1.jar)。 – opstalj
どんなHTTPサーバーでも、クライアントのサーバーだけが接続を閉じないのですか? –