2016-10-04 5 views
0

私は、Spring統合フローの入力ペイロードとして巨大なxmlを持っています。だから、私はペイロードを保持するためにヘッダーエンリッチャーの代わりにトランスのクレームチェックを使用しています。私はメモリ内メッセージストアを使用しています。Spring統合で複数のスレッドを使用する場合のクレームチェック

後で私のSIフローでは、ペイロードを複数のスレッドに分割し、各スレッドは属性ペイロードの1つに基づいて異なるチャネルを呼び出します。私はこれを達成するためにルータを使用しています。各フローまたは各スレッドは、クレーム・チェックアウト・トランスを使用して初期ペイロードを検索し、必要な応答を構築するために使用します。各スレッドは応答を生成し、それらを集約する必要はありません。だから私は複数の応答をキューから落とされる私の流れから出てくるでしょう。

他のスレッドも同じメッセージをチェックアウトしようとするので、チェックアウト中にメッセージを削除できません。メッセージストアからメッセージを削除する最も良い方法は何ですか?

サンプル構成

`<int:chain input-channel="myInputChannel" 
    output-channel="myOutputchannel"> 
    <int:claim-check-in /> 
    <int:header-enricher> 
     <int:header name="myClaimCheckID" expression="payload"/> 
    </int:header-enricher> 
</int:chain>` 

フロー内の他のすべての構成要素は、クレームは、初期ペイロードのための変圧器をチェックアウトしているスプリッタ

<int:splitter input-channel="mySplitterChannel" output-channel="myRouterChannel" expression="mySplitExpression"> </int:splitter>

`<int:router input-channel="myRouterChannel" expression="routerExpression" 
    resolution-required="true"> 
    <int:mapping value="A" channel="aChannel" /> 
    <int:mapping value="B" channel="bChannel" /> 
    <int:mapping value="C" channel="cChannel" /> 
</int:router>` 

各チャネルの前に呼び出されます。では、スレッドがすべて処理された後にメッセージが削除されるようにするにはどうすればよいですか?

答えて

0

メッセージの処理が完了したら、メッセージストアのremove()メソッドを呼び出すだけで済みます。あなたが請求チェックパターンを使用してもポイントが実際に存在しないメモリ内のメッセージストアを使用している場合は、しかし

... expression="@store.remove(headers['myClaimCheckID'])" ... 

とサービスアクティベータを使用することができます。

ペイロードをヘッダーに単純に昇格させると、ストアに格納する以上のメモリを使用しません。

複数のスレッド上の複数のメッセージで終了しても、ヒープ上の同じオブジェクトをすべて指しているため違いはありません。

+0

ご回答いただきありがとうございます。 –

+0

@GaryRusellご回答いただきありがとうございます。私がヘッダーエンリッチャーを超えてクレームチェックを選択した理由は、ペイロードが巨大であるためヘッダーにペイロードを詰めたくないからです。私のSIフローには、今後の使用のためにペイロードを保持する必要のある他のコンポーネントがあります。すべてのペイロードをヘッダーに昇格させたいのではなく、persistentMessageStoreを必要としません。だから私はSimpleMessageStoreを使っていました。私の場合は、パフォーマンスや効率性に関して、クレームチェックやヘッダーエンリッチャーを使用することに違いがないことを意味しますか。 –

+0

一日の終わりには、ストア内にあるかどうかにかかわらず、ヒープ上に1つのインスタンスが存在するか、多くのメッセージから複数の参照があります。主張チェックの主な目的は、ネットワーク帯域幅を節約することです。ウサギやJMSのようなブローカに接続されている4つのアプリA→B→C→Dを考えてみましょう。 AとDだけがペイロードを必要とします。クレーム・チェックを外部ストアで使用すると、大きなペイロードがネットワークに3回ではなく2回だけヒットします。 –

関連する問題