ActiveMQ:消息侦听器不处理队列中的所有条目

时间:2013-05-20 10:33:05

标签: activemq spring-jms jmstemplate

我们有一个要求,我将在n个服务器上部署应用程序,比如说S1,S2,...... Sn。在其中一个服务器上定义了一个activeMQ队列,比如S1。我有配置我的服务器以生成消息并将它们放在S1中配置的同一队列中。虽然所有服务器都配置为使用相同的队列来存储生成的消息,但我的要求是只有n个服务器中的一个处理来自队列的所有消息,再说S1.So而所有服务器都是S1, S2,... Sn可以生成并存储在S1上配置的队列中,只有S1应该处理所有这些。因此我已经禁用除了S1之外的所有服务器的“MessageListener”部分。但出于某种原因,S1并不处理所有事情。我感觉队列正在以循环方式分发消息,尽管其他监听器被禁用。在两个服务器正在访问队列的情况下,S1处理每个备用消息。任何有助于解决此问题的帮助将不胜感激。

注意:如果它有帮助,我正在使用Spring JMS模板并为JMS完成基于Spring XML的配置。

这是我的XML配置代码段

<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://ipaddress:61617"/>
</bean>
<bean id="cscoDest" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="STOCKS.CSCO" />
</bean>
<!--The message listener-->
<bean id="portfolioListener" class="my.test.jms.Listener">
</bean>
<!--Spring DMLC-->
<bean id="cscoConsumer" class="org.springframework.jms.listener.DefaultMessageListenerContainer102">
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="destination" ref="cscoDest" />
<property name="messageListener" ref="portfolioListener" />
</bean>
<!--Spring JMS Template-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
<bean id="stockPublisher" class="my.test.jms.SpringPublisher">
<property name="template" ref="jmsTemplate" />
<property name="destinations">
<list>
<ref local="cscoDest" />
</list>
</property>
</bean>

以上配置存在于我的所有服务器中。我正在禁用'portfolioListener'bean,并且它在所有服务器中的'cscoConsumer'中的属性映射除了根据上面的示例的S1之外。但仍然是消息被以循环方式跳过。

2 个答案:

答案 0 :(得分:0)

  
    

“我感觉队列正在以循环方式分发消息......”。

  

如果其他服务器上没有活跃的消费者,则不会发生这种情况;经纪人将(只)在有消费者时发送消息。

答案 1 :(得分:0)

我明白了。我的错。我只是从服务器上的消费者那里评论出'MessageListener'属性。关键是禁用以下bean -

<bean id="cscoConsumer" class="org.springframework.jms.listener.DefaultMessageListenerContainer102">

非常感谢Gary的帮助。感谢你。