Spring集成 - 在集群中激活1个消息驱动通道适配器

时间:2015-09-29 14:49:20

标签: spring-integration

问题:

将1个活动MDP(下面的jmsIn)连接到单个队列,并将服务器2上的第二个群集MDP保持为被动状态。我只需要一个活动进程,因为我想执行聚合而不是丢失消息。

我一直在阅读有关控制总线的信息,但由于它是一个集群环境,因此通道ID和jms:message-driven-channel-adapter id将在两台服务器上都有保存名称。是否可以使用JMX在另一台服务器上停用控制总线,即使它们具有id?或者可能首先由消息驱动通道适配器进行检查,以确定队列本身是否已经有活动连接。

消息驱动通道适配器示例代码:

<jms:message-driven-channel-adapter id="jmsIn"
        destination="requestQueue"
        channel="jmsInChannel" />

<channel id="jmsInChannel" />


<beans:beans profile="default">
    <stream:stdout-channel-adapter id="stdout" channel="jmsInChannel" append-newline="true"/>
</beans:beans>

<beans:beans profile="testCase">

    <bridge input-channel="jmsInChannel" output-channel="queueChannel"/>

    <channel id="queueChannel">
        <queue />
    </channel>

</beans:beans>

1 个答案:

答案 0 :(得分:0)

  1. 没有理由担心clustered singleton的{​​{1}},因为任何排队系统(如JMS)都是针对特定消息的单个消费者而设计的。换句话说,与队列中的进程数量无关,只有其中一个接收消息并对其进行处理。

  2. JMS上的事务语义可以帮助您丢失消息。如果存在异常,TX rallbacks和消息将返回到队列中,并且可以被其他消费者接收。

  3. 对于聚合器,您确实可以使用一些分布式持久性MessageStore。所有消费者都将其消息发送到同一个<message-driven-channel-adapter>组件,该组件只处理共享<aggregator>以执行其自己的聚合逻辑。