【问题标题】:ActiveMQ : Message listener not processing all entries in queueActiveMQ:消息侦听器未处理队列中的所有条目
【发布时间】:2013-05-21 14:29:36
【问题描述】:

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

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

这是我的 XML 配置 sn -p

<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 之外。但仍然有消息以循环方式被跳过。

【问题讨论】:

  • I have disabled the MessageListener part of all the servers except S1:你是如何禁用它的?可能它并没有真正被禁用,这就是为什么你仍然看到循环分发!

标签: activemq spring-jms jmstemplate


【解决方案1】:

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

如果其他服务器上没有活动消费者,则不会发生这种情况;代理将(可以)仅在有消费者时发送消息。

【讨论】:

  • 所以你的意思是说队列不可能将所有消息发送给一个唯一的消费者进行处理,尽管我禁用了所有其他消费者?我只需要一个消费者,但同一个队列上有多个生产者。
  • 否;我的意思是,如果其他消费者被禁用,代理会将所有消息发送给单个消费者。
  • 我已在线程开启器中添加了我的 XML 配置 sn-p。请查看。
【解决方案2】:

我想通了。我的错。我只是从服务器上的消费者那里注释掉'MessageListener'属性。关键是禁用以下bean -

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 2014-09-24
    • 2012-11-08
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    相关资源
    最近更新 更多