我有一个配置了
的spring消息监听器<bean id="processListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="concurrentConsumers" value="1"/>
<property name="clientId" value="process-execute"/>
<property name="connectionFactory" ref="topicConnectionFactory"/>
<property name="destination" ref="processExecuteQueue"/>
<property name="messageListener" ref="processExecuteListener"/>
</bean>
这是在具有2个节点的群集上运行。我看到它为每个节点创建了1个消费者而不是每个集群创建1个消费者。它们都配置了上面的xml,因此它们具有相同的clientId。然而,当2个通知发布到队列时,两个侦听器都在运行,每个都获得通知,并且两者都并行执行。这是一个问题,因为需要按顺序处理通知。
我似乎无法了解如何使每个群集只有一个消息监听器而不是每个节点。
答案 0 :(得分:0)
我解决了这个问题,让jms队列阻塞下一个使用者直到前一个返回。这是我正在使用的weblogic服务器中的一个功能,称为Order of Order。文档说你只需要在队列上启用它(我使用哈希)。但是,我发现我需要在连接工厂上启用它并设置默认名称。现在我看到每个节点有一个MDP但是1在处理之前等待2完成,反之亦然。不是我想要的解决方案,但它仍在工作。虽然特定于oracle,但实际上它比单个MDP解决方案略好。
注意:我没有在spring jmstemplate生成器中设置order name的单位,因为我不知道是否可能。当生产者没有提供默认名称时,我有weblogic设置默认名称。