1

我们有一个要求,我将在 n 台服务器上部署应用程序,比如 S1、S2 ......Sn。在其中一台服务器上定义了一个 activeMQ 队列,比如 S1。我已经配置了我的服务器生成消息并将它们放置在 S1 中配置的同一队列中。虽然所有服务器都配置为使用相同的队列来存储生成的消息,但我的要求是只有 n 个服务器中的一个处理来自队列的所有消息,再次假设为 S1。所以虽然所有服务器范围从 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 的服务器。但仍然跳过消息循环赛时尚。

4

2 回答 2

0

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

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

于 2013-05-20T11:55:52.360 回答
0

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

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

非常感谢加里的帮助。感谢。

于 2013-05-21T06:29:36.940 回答