pub-subチャネルに追加します(これにより、、、、などのapply-sequence="true"
デフォルトの相関データがメッセージに追加され、ダウンストリームコンポーネントでデフォルトの戦略を使用できるようになります)。correlationId
sequenceSize
sequenceNumber
<aggregator/>
beforeを追加afterThreadingProcessor
し、2つのからの出力をそれにルーティングします<service-activator/>
。
アグリゲーターの後にを追加し<splitter/>
ます-デフォルトのスプリッターは、アグリゲーターによって作成されたコレクションを2つのメッセージに分割します。
afterThreadingProcessor
作業を完了する2番目のスレッドのメッセージごとに1回呼び出されます。
チェーンを使用すると、構成が簡単になります...
<chain input-channel="myOutputChannel">
<aggregator />
<splitter />
<service-activator id="afterThreadingProcessor" input-channel="myOutputChannel" .../>
</chain>
Collection<?>
最終サービスを1回呼び出すには、スプリッターを追加する代わりに、サービスを変更して取得します。
編集:
コメント#3(元のスレッドで最終サービスを実行する)でやりたいことを行うには、これが機能するはずです...
<int:channel id="foo" />
<int:service-activator ref="twoServicesGateway" input-channel="foo"
output-channel="myOutputChannel" />
<int:gateway id="twoServicesGateway" default-request-channel="myPubSub"/>
<int:publish-subscribe-channel id="myPubSub" task-executor="my10ThreadPool"
apply-sequence="true"/>
<int:service-activator input-channel="myPubSub" output-channel="aggregatorChannel"
ref="beanA" method="blah"/>
<int:service-activator input-channel="myPubSub" output-channel="aggregatorChannel"
ref="beanB" method="blah"/>
<int:aggregator input-channel="aggregatorChannel" />
<int:service-activator id="afterThreadingProcessor" input-channel="myOutputChannel" .../>
この場合、ゲートウェイは他の2つのサービスとアグリゲーターをカプセル化します。デフォルトservice-interface
は単純RequestReplyExchanger
です。呼び出し元のスレッドは出力を待ちます。アグリゲーターにはフレームワークがないためoutput-channel
、フレームワークはゲートウェイに応答を送信し、待機中のスレッドはそれを受信します。に戻る<service-activator/>
と、結果が最終サービスに送信されます。
reply-timeout
デフォルトでは、ゲートウェイは無期限に待機し、サービスの1つがnullを返した場合、集約された応答は受信されないため、ゲートウェイにを配置することをお勧めします。
ゲートウェイフローがゲートウェイから実行されることを示すために、ゲートウェイフローをインデントしたことに注意してください。これらは、ゲートウェイの子要素ではありません。