我有一个变压器,它返回一个 Map 作为结果。然后将该结果放到输出通道上。我想要做的是为地图中的每个 KEY 转到不同的频道。如何在 Spring Integration 中配置它?
例如
变压器 -- 生产 --> 地图
地图包含 {(Key1, "some data"), (Key2, "some data")}
所以对于 Key1 -> 转到通道 1 所以对于 Key2 -> 转到通道 2 等等。
代码示例会很有帮助。
在此先感谢 GM
我有一个变压器,它返回一个 Map 作为结果。然后将该结果放到输出通道上。我想要做的是为地图中的每个 KEY 转到不同的频道。如何在 Spring Integration 中配置它?
例如
变压器 -- 生产 --> 地图
地图包含 {(Key1, "some data"), (Key2, "some data")}
所以对于 Key1 -> 转到通道 1 所以对于 Key2 -> 转到通道 2 等等。
代码示例会很有帮助。
在此先感谢 GM
您的处理应包括两个步骤:
对于第一个任务,您必须使用拆分器,而对于第二个任务 - 路由器(标头值路由器最适合这里)。
请在下面找到示例 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;
}
}