Issue:
将1个活动MDP(下面的jmsIn)连接到单个队列,并将服务器2上的第二个群集MDP保持为被动状态 . 我只需要一个活动进程,因为我想执行聚合而不是丢失消息 .
我一直在阅读有关控制总线的信息,但由于它是一个集群环境,因此通道ID和jms:message-driven-channel-adapter id将在两台服务器上都有保存名称 . 是否可以使用JMX在另一台服务器上停用控制总线,即使它们具有id?或者可能首先由消息驱动通道适配器进行检查,以确定队列本身是否已经有活动连接 .
Message-driven-channel-adapter Sample Code:
<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 回答
没有理由担心
<message-driven-channel-adapter>
的clustered singleton
,因为任何排队系统(如JMS)都是针对特定消息的单个消费者而设计的 . 换句话说,独立于队列上的进程数量,只有其中一个接收消息并处理它 .JMS上的事务语义可以帮助您丢失消息 . 如果存在一些异常,TX rallbacks和消息将返回到队列,并且可以被另一个消费者接收 .
对于聚合器,您确实可以使用一些分布式持久性MessageStore . 所有消费者将其消息发送到同一个
<aggregator>
组件,该组件只处理共享MS
以执行其自己的聚合逻辑 .