処理は次の 2 つのステップで構成する必要があります。
- メッセージを個別に処理される別々の部分に分割し、
- 個別のメッセージ (分割の結果) を適切なチャネルにルーティングします。
最初のタスクではスプリッターを使用し、2 番目のタスクではルーターを使用する必要があります (ヘッダー値ルーターがここに最適です)。
以下の Spring Integration 構成のサンプルを見つけてください。メッセージを結合するために、チェーンの最後にアグリゲーターを使用したい場合があります - 私はあなたの裁量に任せます。
<channel id="inputChannel">
<!-- splitting message into separate parts -->
<splitter id="messageSplitter" input-channel="inputChannel" method="split"
output-channel="routingChannel">
<beans:bean class="com.stackoverflow.MapSplitter"/>
</spliter>
<channel id="routingChannel">
<!-- routing messages into appropriate channels basis on header value -->
<header-value-router input-channel="routingChannel" header-name="routingHeader">
<mapping value="someHeaderValue1" channel="someChannel1" />
<mapping value="someHeaderValue2" channel="someChannel2" />
</header-value-router>
<channel id="someChannel1" />
<channel id="someChannel2" />
そしてスプリッタ:
public final class MapSplitter {
public static final String ROUTING_HEADER_NAME = "routingHeader";
public List<Message<SomeData>> split(final Message<Map<Key, SomeData>> map) {
List<Message<SomeData>> result = new LinkedList<>();
for(Entry<Key, SomeData> entry : map.entrySet()) {
final Message<SomeData> message = new MessageBuilder()
.withPayload(entry.getValue())
.setHeader(ROUTING_HEADER_NAME, entry.getKey())
.build();
result.add(message);
}
return result;
}
}