如何使用工作队列行为发布到多个队列?

时间:2014-10-30 10:06:45

标签: java rabbitmq

使用RabbitMQ,我有两种类型的消费者:FileConsumer将消息写入文件,MailConsumer将消息写入邮件。每种类型可能有多个消费者,比如三个正在运行的MailConsumers和一个FileConsumer实例。

我该怎么做:

  • 每个发布的消息应该只由一个FileConsumer实例和一个MailConsumer实例处理
  • 发布消息应该进行一次,而不是每个队列一次(如果可能)
  • 如果没有连接消费者,则消息应排队等待消费,而不是丢弃

我应该使用什么类型的交换来获得这种行为?我真的很想看到一些示例/伪代码来说明这一点。

queues

这应该很容易,但我无法从文档中找到它。似乎fanout example应该有效,但我对这些“匿名队列”感到困惑,这似乎会导致向每个消费者发送相同的消息。

1 个答案:

答案 0 :(得分:2)

如果您创建没有auto-delete标志的队列,那么即使在消费者断开连接后,队列也会保持活跃状态​​。

请注意,如果您将队列声明为持久性,则即使在代理重新启动后它也会出现。

如果您将发布具有delivery-mode=2属性集的消息(这意味着该消息将是持久的),即使在代理重新启动之后,此类消息仍将保持持久性(这对于使队列持久化很重要)队列。

使用fanout交换类型不是必需的。如果需要,您还可以使用topic来更好地处理邮件路由。

UPD:逐步获取您使用架构显示的内容。

  1. 声明持久交换,例如mainexchange.declare (exchange-name=main, type=fanout, durable=true)
  2. Delcare两个队列,比如,filesmailsqueue.declare (queue-name=files, durable=true)queue.declare (queue-name=mails, durable=true)
  3. 将两个队列绑定为queue.bind (queue-name=files, exchange-name=main)queue.bind (queue-name=mails, exchange-name=main)
  4. 此时,您可以向main交换发布消息(请参阅上面有关delivery-mode的说明)并使用来自files FileConsumermails的队列中的任何消费者号码来自MailConsumer和{{1}}。在队列中没有任何消费者的情况下,消息将排队并保持队列直到它们消耗(或者代理重新启动它们不是持久的)。