在现有渠道之外创建新的消息链

时间:2019-01-02 10:13:01

标签: java spring-integration

我希望从现有渠道中创建一条消息链,而不必再次专门写所有元素。

目前,我有一些长链,它们与某些元素相互重叠。每次添加新元素时,都必须将其添加到多个链中。我希望创建一个通道链,可以将其称为序列。

为简化起见,目前我的applicationContext具有3个通道。频道1和频道2,以及频道3,由以下两个组成:

<int:chain input-channel="channel-1">
    <int:service-activator ref="serviceA" method="doService" />
    <int:service-activator ref="serviceB" method="doService" />
    <int:service-activator ref="serviceC" method="doService" />
</int:chain>

<int:chain input-channel="channel-2">
    <int:service-activator ref="serviceD" method="doService" />
    <int:service-activator ref="serviceE" method="doService" />
    <int:service-activator ref="serviceF" method="doService" />
</int:chain>

<int:chain input-channel="channel-3">
    <int:service-activator ref="serviceA" method="doService" />
    <int:service-activator ref="serviceB" method="doService" />
    <int:service-activator ref="serviceC" method="doService" />
    <int:service-activator ref="serviceD" method="doService" />
    <int:service-activator ref="serviceE" method="doService" />
    <int:service-activator ref="serviceF" method="doService" />
</int:chain>

我正在寻找一种简单的解决方案,它将使我能够做类似的事情

<int:chain input-channel="channel-3">
    <??? channel-1 />
    <??? channel-2 />
</int:chain>

有一些简单的方法可以做到吗?

1 个答案:

答案 0 :(得分:2)

我认为您已经误解了chainchannel的概念。

  1. channel管道过滤器的核心,因为它是 管道 ,因此天气是否使用链,还是仍然使用频道。链允许您执行的操作是通过定义 filter 元素的 list 来简化流程的定义。这些元素仍与匿名渠道相关。

  2. 明确引用了显式通道(例如<int:channel...>),从而允许多个流通过向/从此类通道发送或接收消息来相互缠绕渠道。

因此,希望您能看到从渠道创建链既违反了 pipes-and-filters 架构,也违反了我们试图保持非常一致的框架设计。换句话说,我从您的帖子中看到的是,您有一些流程可能是生产者和/或消费者的其他流程(全部或部分),如果是情况下,只需使用显式渠道即可。

这是流程的简化版本:

<int:chain input-channel="channel-1" output-channel="channel-1out">
    <int:service-activator ref="serviceA" method="doService" />
    <int:service-activator ref="serviceB" method="doService" />
    <int:service-activator ref="serviceC" method="doService" />
</int:chain>

<int:chain input-channel="channel-2">
    <int:service-activator ref="serviceD" method="doService" />
    <int:service-activator ref="serviceE" method="doService" />
    <int:service-activator ref="serviceF" method="doService" />
</int:chain>

<int:bridge input-channel="channel-1out" output-channel="channel-2"