如何配置一个侦听器来处理来自rabbitmq spring中同一队列的多个交换的消息

时间:2014-09-25 14:14:15

标签: java spring rabbitmq

我的应用程序中有一个队列,它监听多个交换,每个交换使用不同的路由密钥。

我已将侦听器配置为以下列方式处理来自其中一个交换的消息:

<bean id="exampleMessageConverter"     class="org.springframework.amqp.support.converter.JsonMessageConverter">
    <property name="classMapper">
        <bean class="<packagename>.NamedClassMapper">
            <constructor-arg value="<packagename>.exampleDTO" />
        </bean>
    </property>
</bean>

<bean id="organizationUpdateEventListener" class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="queueNames" value="${main.queue}" />
    <property name="messageListener">
        <bean class="org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter">
            <constructor-arg>
                <bean class="<packageName>.exampleMessageEventHandler" />
            </constructor-arg>
            <constructor-arg ref="exampleMessageConverter" />
        </bean>
    </property>
    <property name="adviceChain">
        <list>
            <ref bean="retryAdvice" />
        </list>
    </property>
</bean>

我想配置相同的侦听器来处理来自其他交换机的消息,但是从每个交换机发送的DTO是不同的。

编辑: 每个路由键的第二个构造函数参数需要不同。如何添加该配置

我该如何处理?

1 个答案:

答案 0 :(得分:1)

看起来你有点不了解AMQP协议。

制作人通过ExchangeroutingKey发送消息。

bind必须queue Exchange routingKey {/ 1}}。

当然,对于具有不同queue和不同Exchange s的相同routingKey,您可以拥有多个绑定。但无论如何它将是同一个队列。

因此,您的侦听器应配置为仅从该队列接收消息。因为对他来说,消息在队列中的出现方式并不重要。

对不起,如果我没有正确理解你的问题......

<强>更新

  

我想要的是每个路由键的第二个构造函数参数<constructor-arg ref="exampleMessageConverter" />需要不同。

您不能从SimpleMessageListenerContainer执行此操作,您可以在目标routing下游的某个位置实现所需的exampleMessageEventHandler逻辑,即Spring {AMRP MessageProperties Message }}具有属性getReceivedExchange()getReceivedRoutingKey()