【问题标题】:Spring Integration Splitter Map Keys to different channelsSpring Integration Splitter 将键映射到不同的通道
【发布时间】:2013-07-05 02:02:40
【问题描述】:

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

例如

Transformer -- 产生 --> Map

Map 包含 {(Key1, "some data"), (Key2, "some data")}

所以对于 Key1 --> 转到通道 1 所以对于 Key2 --> 去通道 2 等等。

代码示例会很有帮助。

提前致谢 通用汽车

【问题讨论】:

    标签: spring spring-integration


    【解决方案1】:

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

    1. 将消息划分为单独的部分,这些部分将被独立处理,
    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;
      } 
    }
    

    【讨论】:

    • 嗨 Piotrek,感谢您的回复,我会试试这个。
    • 不客气 ;) 如果对该方法有任何问题,请告诉我 - 我直接将其编写为堆栈溢出,所以我可能会遗漏一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多