如何汇总来自多个渠道的响应

时间:2020-06-28 21:20:36

标签: spring spring-integration spring-integration-dsl

我有一个spring-integration实现,具有以下内容:

  1. 多个发布渠道在一个公共渠道上发布。
  2. 所有通道都返回相同的响应对象。
  3. 聚集器试图聚集来自以上所有渠道的响应

问题:聚合器无法将所有响应组合在一起,并且提供的方法在通道的第一个响应上被调用

这是详细信息。汇总响应我该怎么做?

<int:publish-subscribe-channel id="aggregate-channel" apply-sequence="true"/>
<int:publish-subscribe-channel id="input-channel" apply-sequence="true"/>

<int:service-activator input-channel="input-channel" output-channel="aggregate-channel" ref="...A" method="...A">
<int:service-activator input-channel="input-channel" output-channel="aggregate-channel" ref="...B" method="...B">
<int:service-activator input-channel="input-channel" output-channel="aggregate-channel" ref="...C" method="...C">
<int:service-activator input-channel="input-channel" output-channel="aggregate-channel" ref="...D" method="...D">

<!--This is the aggregator. 
**Expecting a list of size 4 but then it gets list of size 1 for each response channel
-->
<int:aggregator input-channel="aggregate-channel" output-channel="gateway-response-channel" ref="Service" method="responseListProcessor"/>

2 个答案:

答案 0 :(得分:1)

解决方案

  • 替换
<int:publish-subscribe-channel id="aggregate-channel" apply-sequence="true"/>
    with
<int:publish-subscribe-channel id="aggregate-channel"/>

问题

  • 最初,它以序列大小4开始,因为input-channel4个订阅者
  • 但是,当您将属性apply-sequence="true"添加到aggregate-channel时,它将序列大小重置为1,因为aggregate-channel只有一个订阅者,即aggregator

参考

https://docs.spring.io/spring-integration/docs/5.1.7.RELEASE/reference/html/#channel-configuration-pubsubchannel

如果在PublishSubscribeChannel的下游提供聚合器,则可以将通道上的“ apply-sequence”属性设置为true。

这样做表示在传递消息之前,通道应设置序列大小和序列号消息头以及相关性ID。

例如,如果有五个订户,则序列大小将设置为5,并且消息的序列号标头值将在1到5之间。

答案 1 :(得分:0)

我想说,您的要求已完全满足此类EIP任务的要求-分散收集:http://example.com/add.php?user=me&pass=mypassword