我遵循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工作正常。
答案 0 :(得分:1)
这是容器解析器中的一个错误,每个侦听器都有自己的容器(命名空间只是指定公共属性的一种方便方法)。如果删除id="myListenerContainer"
,它将起作用 - 因为每个容器都会获得(不同的)生成的名称。指定id后,两个bean都会获得相同的名称,最后一个定义将替换第一个。
或者,声明两个具有不同ID的独立容器元素,每个元素只有一个侦听器。
感谢您找到这个。
请打开JIRA issue
编辑:此问题为resolved in version 1.2.1。