添加多个侦听器将侦听不同的RabbitMQ队列无法正常工作

时间:2013-09-10 18:33:28

标签: java rabbitmq spring-amqp

我遵循spring xml配置

<bean id="connectionFactory"
          class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
 <constructor-arg value="xxxxxxxx"/>
        <property name="username" value="xxxxx"/>
        <property name="password" value="xxxxx"/>
        <property name="channelCacheSize" value="25"/>
        <property name="virtualHost" value="/"/>
        <property name="port" value="3453"/>
 </bean>

 <rabbit:template id="tutorialTemplate" connection-factory="connectionFactory"/>
 <!-- 1st queue -->             
 <rabbit:queue id="veliteQueue" name="ES_queue" durable="true" auto-delete="false" exclusive="false"/>

 <rabbit:direct-exchange id="myExchange" durable="true" name="ES_exchange">
     <rabbit:bindings>
        <rabbit:binding queue="veliteQueue" key="logstash"></rabbit:binding>
     </rabbit:bindings>
 </rabbit:direct-exchange>

  <!-- 2nd Queue -->
 <rabbit:queue id="veliteQueue1" name="ES_queue_Temp" durable="true" auto-delete="false" exclusive="false"/> 

  <rabbit:direct-exchange id="myExchange1" durable="true" name="ES_exchange_temp">
    <rabbit:bindings>
        <rabbit:binding queue="ES_queue_Temp" key="logstash_temp"></rabbit:binding>
    </rabbit:bindings>
   </rabbit:direct-exchange> 
   <!-- 2 Listeners for 2 queue's mentioned above --> 
   <bean id="aListener" class="com.vzw.es.cosumer.SpringMessageListener" autowire="byName"/>
<bean id="aListener1" class="com.vzw.es.cosumer.SpringMessageListener1" autowire="byName"/>

<rabbit:listener-container id="myListenerContainer" connection-factory="connectionFactory" acknowledge="auto" prefetch="750" concurrency="1">
    <rabbit:listener ref="aListener" queues="veliteQueue"/>
    <rabbit:listener ref="aListener1" queues="veliteQueue1"/>
</rabbit:listener-container>

现在在我的Java代码中,我有2个监听器类com.vzw.es.cosumer.SpringMessageListener和com.vzw.es.cosumer.SpringMessageListener1。现在当我运行我的主类时,只有1个侦听器的onMessage方法被调用,即SpringMessageListener1,我确实从RabbitMQ检查了,并且队列中有足够的消息要消耗。 Spring / Rabbitmq高手可以帮我解决这个问题。此外,当我从xml注释掉第二个队列及其监听器时,SpringMessageListener工作正常。

1 个答案:

答案 0 :(得分:1)

这是容器解析器中的一个错误,每个侦听器都有自己的容器(命名空间只是指定公共属性的一种方便方法)。如果删除id="myListenerContainer",它将起作用 - 因为每个容器都会获得(不同的)生成的名称。指定id后,两个bean都会获得相同的名称,最后一个定义将替换第一个。

或者,声明两个具有不同ID的独立容器元素,每个元素只有一个侦听器。

感谢您找到这个。

请打开JIRA issue

编辑:此问题为resolved in version 1.2.1