Spring Integration Aggregator与Publish Subscriber相结合

时间:2016-06-16 19:04:52

标签: spring-integration splitter

我在Spring集成中有基本问题。我尝试在其他线程中搜索,但对答案不满意。所以这是我的问题。任何提示都将受到高度赞赏。

我试图从4个不同来源并行获取数据并汇总数据。

我的理解(根据我之前读过的一个主题)是,如果是直接通道,则分离器的任何输出通道都是顺序路由请求。

但是Splitter的输出通道是一个接收列表路由器。当我调试时,请求被顺序路由。所以通过一些分析,我发现我们可以使用有效载荷类型的路由器并行处理。

所以我将路由器改为有效载荷类型的路由器,但仍然按顺序路由请求。

所以我改变了我的策略并使用了Publish-subscriber Channel并将所有订阅频道的输出连接到聚合器,以便我可以聚合结果。我能够并行获取数据但我没有看到响应被路由到聚合。我做错了吗?请提出建议!

    <int:publish-subscribe-channel id="PublishSubscriberChannel"
    task-executor="taskExecutor" />

<task:executor id="taskExecutor" pool-size="5" />

<int:service-activator input-channel="PublishSubscriberChannel"
    ref="lookUpService" method="lookupSource1" output-channel="lookupAggregatorChannel" />

<int:service-activator input-channel="PublishSubscriberChannel"
    ref="lookUpService" method="lookupSource2" output-channel="lookupAggregatorChannel" />

<int:service-activator input-channel="PublishSubscriberChannel"
    ref="lookUpService" method="getVehicleInfoWithAdditionalAttributes"
    output-channel="lookupAggregatorChannel" />

<int:service-activator input-channel="PublishSubscriberChannel"
    ref="lookUpService" method="lookupSource4" output-channel="lookupAggregatorChannel" />

1 个答案:

答案 0 :(得分:0)

所以最后,我发现了我做错了什么。 最初,我正在开发Spring Integration Version 2.0。这是一个旧的应用程序。因此,当我的代码完全是问题中给出的内容时,我看不到请求被路由到聚合器。 然后,当我将Spring版本升级到4.3.2 RELEASE时,我开始收到相关策略可能为null的错误。那时我发现聚合器需要一个关联ID,如果我有自动添加拆分器相关ID,并且对于Publish-Subscribe Channel,我们需要添加apply-sequence =“true”以便添加一个默认的相关ID,由聚合器使用。所以从本质上讲,这就是我的代码现在看起来如何工作并且完美无缺。

<int:publish-subscribe-channel id="PublishSubscriberChannel" apply-sequence="true"
    task-executor="taskExecutor" />

<task:executor id="taskExecutor" pool-size="5" />

<int:service-activator input-channel="PublishSubscriberChannel"
    ref="lookUpService" method="lookupSource1" output-channel="lookupAggregatorChannel" />

<int:service-activator input-channel="PublishSubscriberChannel"
    ref="lookUpService" method="lookupSource2" output-channel="lookupAggregatorChannel" />

<int:service-activator input-channel="PublishSubscriberChannel"
    ref="lookUpService" method="lookupSource3"
    output-channel="lookupAggregatorChannel" />

<int:service-activator input-channel="PublishSubscriberChannel"
    ref="lookUpService" method="lookupSource4" output-channel="lookupAggregatorChannel" />