我的应用程序中有一个队列,它监听多个交换,每个交换使用不同的路由密钥。
我已将侦听器配置为以下列方式处理来自其中一个交换的消息:
<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是不同的。
编辑: 每个路由键的第二个构造函数参数需要不同。如何添加该配置
我该如何处理?
答案 0 :(得分:1)
看起来你有点不了解AMQP协议。
制作人通过Exchange
向routingKey
发送消息。
bind
必须queue
Exchange
routingKey
{/ 1}}。
当然,对于具有不同queue
和不同Exchange
s的相同routingKey
,您可以拥有多个绑定。但无论如何它将是同一个队列。
因此,您的侦听器应配置为仅从该队列接收消息。因为对他来说,消息在队列中的出现方式并不重要。
对不起,如果我没有正确理解你的问题......
<强>更新强>
我想要的是每个路由键的第二个构造函数参数
<constructor-arg ref="exampleMessageConverter" />
需要不同。
您不能从SimpleMessageListenerContainer
执行此操作,您可以在目标routing
下游的某个位置实现所需的exampleMessageEventHandler
逻辑,即Spring {AMRP MessageProperties
Message
}}具有属性getReceivedExchange()
和getReceivedRoutingKey()