Spring rabbitmq配置,用于接收使用单个队列和多个侦听器在模式上过滤的消息
我需要将消息推送到一个队列,但在多个地方接收它们(java类) 为此,我使用了一个主题交换,并将其绑定到一个队列,该队列接收基于不同模式的消息。现在,当我尝试在另一端接收它们时,侦听器容器将消息发送给两个侦听器,而不是根据所决定的模式将它们分开 为了快速查看,我附上了下面的配置和代码Spring rabbitmq配置,用于接收使用单个队列和多个侦听器在模式上过滤的消息,spring,rabbitmq,spring-amqp,Spring,Rabbitmq,Spring Amqp,我需要将消息推送到一个队列,但在多个地方接收它们(java类) 为此,我使用了一个主题交换,并将其绑定到一个队列,该队列接收基于不同模式的消息。现在,当我尝试在另一端接收它们时,侦听器容器将消息发送给两个侦听器,而不是根据所决定的模式将它们分开 为了快速查看,我附上了下面的配置和代码 <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans"
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
<rabbit:connection-factory id="connectionFactory" host="localhost" username="guest" password="guest" />
<rabbit:admin connection-factory="connectionFactory" />
<rabbit:template id="pgTemplate" connection-factory="connectionFactory" exchange="PG-EXCHANGE"/>
<rabbit:queue id="pgQueue" />
<rabbit:topic-exchange id="pgExchange" name="PG-EXCHANGE">
<rabbit:bindings>
<rabbit:binding queue="pgQueue" pattern="pg"></rabbit:binding>
<rabbit:binding queue="pgQueue" pattern="txn"></rabbit:binding>
</rabbit:bindings>
</rabbit:topic-exchange>
<bean id="pgReceiver" class="com.pg.mq.service.impl.MessageReceiver"/>
<bean id="txnReceiver" class="com.pg.mq.service.impl.MessageReceiver"/>
<rabbit:listener-container id="ListenerContainer" connection-factory="connectionFactory">
<rabbit:listener ref="pgReceiver" queues="pgQueue" method="handleMessage"/>
<rabbit:listener ref="txnReceiver" queues="pgQueue" method="handleMessage"/>
</rabbit:listener-container>
</beans>
消息接收者
PG接收机
public void handleMessage(Rabbit message) {
System.out.println("inside Message Receiver");
System.out.println("Listener received message----->" + message);
}
TXN接收机
public void handleMessage(Rabbit message) {
System.out.println("inside TXN Message Receiver");
System.out.println("Listener received message----->" + message);
}
呼叫代码
Sender sender = (Sender) context.getBean("messageSender");
for(int i = 0; i < 30; i++) sender.pushMessagePG(new Rabbit(5));
Thread.sleep(2000);
for(int i = 0; i < 30; i++) sender.pushMessageTXN(new Rabbit(2));
Sender=(Sender)context.getBean(“messageSender”);
对于(inti=0;i<30;i++)sender.pushMessagePG(新兔子(5));
《睡眠》(2000年);
对于(inti=0;i<30;i++)sender.pushMessageTXN(新兔子(2));
很抱歉,您对AMQP规范有点不了解
routingKey
路由键
或模式
为主题交换
分发的机制。我的意思是类似于JMS中的主题
概念
主题交换
将消息放入与绑定的模式
匹配的所有队列routingKey
一无所知
因为同一个队列有两个侦听器,所以它们都可以处理来自该队列的消息并不奇怪,而且独立于routingKey
您确实应该为不同的模式使用不同的队列。或者考虑使用它的代码>消息路由< /代码>电源。您可以使用标准的
AmqpHeaders.RECEIVED_ROUTING_KEY
(Spring Integration)报头来处理这种情况。感谢所有的澄清。我不熟悉AMQP,确切地说,我不熟悉消息队列实现。正如您所提到的,我目前正在使用每队列模式设计。但在这种情况下,我必须在每次添加路由密钥时创建一个队列。我尝试使用一个队列来获得相同的结果,至少类似于pg.rom.*和pg.com.*我实际上读了你提到的同一篇文章,来指导我自己这个概念。并且已经从那里了解了我目前在应用程序中使用的每模式队列设计。是的,这是正确的:同一队列有多个模式,但在使用者端没有自动路由:它只是轮询队列中的消息。这是您关心的问题。是的,确切地说,我正在寻找一种可能的方法,在消息从队列中轮询并发送到适当的接收者时,根据模式过滤消息,而不是像您提到的那样简单地轮询绑定的接收者。
Sender sender = (Sender) context.getBean("messageSender");
for(int i = 0; i < 30; i++) sender.pushMessagePG(new Rabbit(5));
Thread.sleep(2000);
for(int i = 0; i < 30; i++) sender.pushMessageTXN(new Rabbit(2));