2012-05-29 31 views
6

私たちは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を使用しています。

+0

あなたはCamelsのhttpコンポーネントを使いますか? –

+0

こんにちは、私はCamel 2.9.2を使用しています(2.9.1ではなく、前述の:()とcamel-http-2.9.2.jar(とcommons-httpclient-3.1.jar)。 – opstalj

+0

どんなHTTPサーバーでも、クライアントのサーバーだけが接続を閉じないのですか? –

答えて

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"); 
1

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

公式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> 

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

+0

あまりにも悪いですが、試してみましたが効果がないようです... Camelアプリケーションに伝える方法があるはずです必要な情報がすべて受信されているのでTCP接続を閉じることができますか? – opstalj

+0

これをシステムプロパティとして設定しようとすると、JavaのHTTP4クライアントがこの問題を解決するはずです –

+0

違いがありますか? HTTP4ではなくHTTPコンポーネント...? – opstalj

関連する問題