3

我有以下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 进行了检查,并且两个队列都有足够的消息来消费。

此外,当我从 xml SpringMessageListener 注释掉第二个队列及其侦听器时,它的效果也很好。

4

1 回答 1

1

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

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

感谢您找到这个。

请打开一个JIRA 问题

编辑:此问题已在版本 1.2.1 中解决

于 2013-09-10T23:31:25.597 回答