8

我可以使用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”的交换“公共”,并将该交换的绑定设置为“myqueue”。

我会很感激任何帮助!

4

1 回答 1

25

听起来您的所有消费者都订阅了同一个队列。当多个消费者订阅同一个队列时,RabbitMQ 的默认行为是轮询所有订阅消费者之间的消息。请参阅RabbitMQ 教程 #2:工作队列中的“循环调度” 。

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

于 2013-03-11T19:10:03.187 回答