5

結果として Map を返すトランスフォーマーがあります。この結果は、出力チャネルに出力されます。私がやりたいことは、マップ内のキーごとに異なるチャネルに移動することです。Spring Integration でこれを構成するにはどうすればよいですか?

例えば

Transformer -- 生成 --> マップ

Map contains {(Key1, "some data"), (Key2, "some data")}

Key1 の場合 --> チャネル 1 に移動 Key2 の場合 --> チャネル 2 に移動 など..

コード例が役立ちます。

よろしくお願いします。

4

1 に答える 1

3

処理は次の 2 つのステップで構成する必要があります。

  1. メッセージを個別に処理される別々の部分に分割し、
  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;
  } 
}
于 2013-07-07T21:03:09.590 に答える