7

オーケストレーションエンジンとして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を使用しています。

4

2 に答える 2

4

残念ながら、Connectionヘッダーをフィルターで除外しないカスタムHttpHeaderFilterStrategyクラスを作成する以外の解決策は見つかりませんでした。次に、リクエストを外部サーバーに送信する前に、ヘッダー「Connection:close」を設定しています。この要求が応答されるとすぐに、CamelコードはTCP接続を閉じるためにTCP FIN、ACKを送信します。

詳細:

1)カスタムHttpHeaderFilterStrategyクラスを作成します。例:CustomHttpHeaderFilterStrategy

2)applicationContext.xmlを適応させて、そのクラスを指すようにします。例:

<bean id="http" class="org.apache.camel.component.http.HttpComponent">
    <property name="camelContext" ref="camel"/>
    <property name="headerFilterStrategy" ref="myHeaderFilterStrategy"/>
</bean>

<bean id="myHeaderFilterStrategy" class="com.alu.iptc.com.CustomHttpHeaderFilterStrategy">
</bean>

3)Connection:closeヘッダーが設定されるように、コードを調整します。例:

exchange.getOut().setHeader("Connection","close");
于 2012-06-04T13:02:10.183 に答える
1

HTTP1.1接続は、パフォーマンス上の理由から1つのTCPセッションで複数のファイルを配信できるようにするために、最初のメッセージの後でしばらくの間存続していると見なされます。通常、httpサーバーは、複数のファイルをダウンロードできるようにしながら、スレッドを保存するために数秒後に接続を切断する場合があります。Camelhttpコンポーネントはおそらく同じように動作します。 http://en.wikipedia.org/wiki/HTTP_persistent_connection

Camelが依存する公式のHTTPクライアントは、持続的接続を使用するように構成することも、使用しないように構成することもできますが、デフォルトはtrueです:http: //docs.oracle.com/javase/1.5.0/docs/guide/net/http-keepalive。 html

試したことはありませんが、システムプロパティを設定して設定できるはずです。

http.keepAlive=<boolean>

必要に応じて、ラクダのコンテキストで設定できるはずです

<camelContext>
   <properties>
       <property key="http.keepAlive" value="false"/>
  </properties> 
</camelContext>

私はそれを試したことがないことに注意してください。あなたがそれを機能させるならば、結果を聞くのは素晴らしいでしょう!

于 2012-05-31T06:37:52.567 に答える