1

私はSpring統合が初めてで、SIプロジェクトに取り組んでいます。チャネル (fromAdapter) からメッセージを取得し、トランスフォーマーを呼び出し、出力を別のチャネル (toQueue) に送信するという単純な仕事をしています。以下のコードは、SI 構成ファイルで使用されます ----

<int:channel id="fromAdapter"></int:channel>
<int:channel id="toQueue">  
</int:channel>  
<bean id="trans" class="src.MyTransformer"></bean>  
<int:transformer input-channel="fromAdapter" output-channel="toQueue" ref="trans"></int:transformer>

ただし、今は少し複雑な要件があります。メッセージの値に基づいて、常に 1 つのトランスフォーマーにメッセージを送信する代わりに、6 つのトランスフォーマーのいずれかにメッセージを送信したいと考えています。これはどのように実装できますか?

4

2 に答える 2

1

これらの6つのトランスフォーマーを単一のポイントツーポイントチャネルのサブスクライバーとして宣言できます。デフォルトでは、ラウンドロビンディスパッチング戦略が使用されます(メッセージごとに1つのトランスフォーマーのみが呼び出されますが、常に次のトランスフォーマーが選択されます。リストしてからサイクルします)。

あなたの場合、これらすべてのトランスフォーマーがまったく同じ入力チャネルと出力チャネルを使用するように宣言するだけで、上記が自動的に行われます。


メッセージの属性に基づいてトランスフォーマーを選択するには、特定の種類のメッセージに一致させるために、リスト内のそれぞれにaとarecipient-list-routerを定義します。また、受信者ごとに異なるチャネル名を使用する必要があります。次に、これらの各チャネルは、目的のトランスフォーマーによる入力として使用されます。selector-expressionrecipient

<recipient-list-router input-channel="fromAdapter" default-output-channel="toQueue">
    <recipient channel="t1" selector-expression="payload.someFlag"/>
    <recipient channel="t2" selector-expression="headers.someOtherFlag"/>
</recipient-list-router>

<transformer input-channel="t1" ref="transformer1" method="transform"/>
<transformer input-channel="t2" ref="transformer2" method="transform"/>

このアプローチでは、メッセージが複数のセレクター式に一致する可能性があるため、相互に排他的な式を提供するのはユーザーの責任であることに注意してください。

または、インフラストラクチャコードを作成する場合は、独自の実装を作成LoadBalancingStrategyして、それをポイントツーポイントチャネルに提供できます。その後、戦略は各メッセージに適切なハンドラーを選択する責任があります。

于 2013-01-07T08:15:10.063 に答える
1

受信者リスト ルーターは機能し、メッセージを複数のトランスフォーマーに送信する場合には適切かもしれませんが、そうでない場合は、セレクター式を相互に排他的にするように注意する必要があります。おそらく、より単純なルーターの 1 つがより適切である可能性があります。例えば...

<header-value-router input-channel="routingChannel" header-name="foo">
    <mapping value="1" channel="channel1" />
    <mapping value="2" channel="channel2" />
</header-value-router>

また

<router id="spelRouter" input-channel="expressionRouter"
                    expression="payload.someProperty"
        default-output-channel="defaultChannelForExpression"
        resolution-required="false">
    <mapping value="foo" channel="fooChannelForExpression"/>
    <mapping value="bar" channel="barChannelForExpression"/>
</router>
于 2013-01-07T14:37:08.903 に答える