问题:
将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>
答案 0 :(得分:0)
没有理由担心clustered singleton
的{{1}},因为任何排队系统(如JMS)都是针对特定消息的单个消费者而设计的。换句话说,与队列中的进程数量无关,只有其中一个接收消息并对其进行处理。
JMS上的事务语义可以帮助您丢失消息。如果存在异常,TX rallbacks和消息将返回到队列中,并且可以被其他消费者接收。
对于聚合器,您确实可以使用一些分布式持久性MessageStore
。所有消费者都将其消息发送到同一个<message-driven-channel-adapter>
组件,该组件只处理共享<aggregator>
以执行其自己的聚合逻辑。