Spring rabbitmq配置,用于接收使用单个队列和多个侦听器在模式上过滤的消息

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"

我需要将消息推送到一个队列,但在多个地方接收它们(java类)

为此,我使用了一个主题交换,并将其绑定到一个队列,该队列接收基于不同模式的消息。现在,当我尝试在另一端接收它们时,侦听器容器将消息发送给两个侦听器,而不是根据所决定的模式将它们分开

为了快速查看,我附上了下面的配置和代码

<?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
  • 队列通过
    路由键
    模式
    主题交换
  • 只有单个消费者才能从队列接收消息
  • AMQP中没有类似于
    分发
    的机制。我的意思是类似于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));