提问者:小点点

RabbitMQ扇出交换出现故障


我能够使用Publish/SubscribeRabbitMQ Java教程创建扇出交换,任何连接的使用者都将收到一个消息的副本。我想在连接任何使用者之前创建交换和绑定,而不是动态/编程地声明交换和绑定。我已经通过RabbitMQ管理控制台完成了这一点。然而,由于某种原因,我的消费者以循环方式接收消息,而不是全部接收消息的副本。我错过了什么?下面是一些代码片段:

发布者:

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

消费者:

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

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

如果有任何帮助我会很感激的!


共1个答案

匿名用户

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

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