Spring Integration Splitter Map键到不同的通道

时间:2013-07-07 18:04:08

标签: spring spring-integration

我有一个变换器,它返回一个Map作为结果。然后将该结果放到输出通道上。我想要做的是为地图中的每个KEY转到不同的频道。如何在Spring Integration中配置它?

e.g。

变压器 - 生产 - >图

地图包含{(Key1,“某些数据”),(Key2,“某些数据”)}

所以对于Key1 - >去频道1 所以对于Key2 - >去频道2 等。

代码示例会有所帮助。

提前致谢 GM

1 个答案:

答案 0 :(得分:3)

您的处理应包含两个步骤:

  1. 将邮件分区为将单独处理的单独部分,
  2. 将单独的消息(拆分结果)路由到适当的通道中。
  3. 对于第一个任务,您必须使用拆分器,而对于第二个任务 - 路由器(标头值路由器最适合此处)。

    请在下面找到一个示例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;
      } 
    }