代码之家  ›  专栏  ›  技术社区  ›  littleK

RabbitMQ扇出交换机故障

  •  10
  • littleK  · 技术社区  · 12 年前

    我可以使用 Publish/Subscribe RabbitMQ Java教程,并且任何连接的消费者都将收到消息的副本。我希望在连接任何使用者之前创建交换和绑定,而不是动态/编程地声明交换和绑定。我已经通过RabbitMQ管理控制台完成了这项工作。然而,出于某种原因,我的消费者以循环方式接收消息,而不是所有人都接收消息的副本。我错过了什么?以下是一些代码片段:

    出版商:

    channel.basicPublish("public", "", null, rowId.getBytes("UTF-8"));
    

    消费者:

    QueueingConsumer consumer = new QueueingConsumer(channel);
                channel.basicConsume("myqueue", false, consumer);
    

    …在RabbitMQ管理控制台中,我创建了一个类型为“fanout”的交换“public”,并将该交换的绑定设置为“myqueue”。

    如果有任何帮助,我将不胜感激!

    2 回复  |  直到 11 年前
        1
  •  26
  •   Brian Zell    12 年前

    听起来您的所有消费者都在订阅同一个队列。当多个使用者订阅同一队列时,RabbitMQ的默认行为是在所有订阅的使用者之间循环消息。请参阅中的“循环调度” RabbitMQ Tutorial #2: Work Queues .

    扇出交换是为了确保绑定到它的每个队列都能获得消息的副本,而不是每个消费者。如果您希望每个使用者都获得消息的副本,通常您会让每个使用者创建自己的队列,然后绑定到交换机。我不知道你为什么试图避免以编程方式创建/绑定队列,但如果你提前知道订阅者的数量,并为每个订阅者创建一个队列,你可以得到同样的效果。

        2
  •  0
  •   ashkan moghadasi    3 年前

    您应该手动或随机为每个使用者创建新队列 使用此命令的非持久队列。

    var queueName=通道.QueueDeclare().queueName;

    每个使用者使用相关的队列名称并接收所有消息

    推荐文章