当前位置: 首页 > 知识库问答 >
问题:

RabbitMQ扇出交换出现故障

呼延智明
2023-03-14

我能够使用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个答案

梁丘诚
2023-03-14

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

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

 类似资料:
  • 我一直在尝试使用RabbitMQ,但遇到了以下问题(与此非常类似:RabbitMQ中的主题交换与直接交换)。 我需要密集地广播大约800种类型的消息(因此每种消息类型都会有很多消费者),我想知道以下哪种方法更好: > 创建一个直接交换,在该交换中,消息将使用路由密钥(消息类型名称)发送,每个消费者都将通过绑定了相应路由密钥的临时队列连接到该交换。(因为没有像“key1.key2.*”这样复杂的路由

  • 我们有一个队列和交换集群来支持消息。 null 我们每个队列都有一个交换,以便在重试超时期间后将重试的消息发送回特定的队列。 在这个场景中,我们有3个交换(“foo-exchange”、“foo-exchange-dead”、“baz-exchange-retry(每个队列1个fanout exchange)”和3个队列(“baz-queue”、“baz-queue-delay”、“baz-que

  • 我正在使用RabbitMQ,我对使用扇出交换和类的(或)方法感到困惑。 例如,我有两个持久队列的使用者QUEUE-01和QUEUE-02,它们绑定到持久扇出交换fanout-01。并将1个发布服务器发送到FANOUT-01。我理解当消息使用(或)方法发布时会发生什么,消息将被复制到每个队列并由每个使用者处理。但我不确定如果我将调用方法会发生什么?我会从哪位消费者那里得到回复?有什么特别的行为吗?我

  • 在我的应用程序中,我使用spring cloud stream集成Rabbit MQ。默认情况下,spring cloud streams将目标创建为Rabbit MQ中的交换类型主题。如何配置spring cloud stream以创建fanout类型的交换?

  • 我最近一直在用芹菜,我不喜欢它。它的配置是混乱的,过于复杂的,并且没有很好的文档记录。 我想从一个生产者向多个消费者发送带有芹菜的广播消息。使我困惑的是芹菜术语和底层传输rabbitMQ的术语之间的差异。 在RabbitMQ中,您可以使用单个扇出交换和多个队列来广播消息: 但在Celery中,术语都搞乱了:这里可以有一个广播队列,它向多个消费者发送消息: 我甚至不明白Celery广播队列应该如何工

  • 问题内容: 我有下面的代码使用来将消息发布到队列中。该是越来越创建,但该消息无法被看到的队列。我也没有看到任何错误。 BasicApplication.java Producer.java 问题答案: 您使用了错误的方法;该方法的第一个参数是。 使用。