gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:19:03 29 4
gpt4 key购买 nike

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

我该怎么做:

  • 每条已发布的消息都应由一个 FileConsumer 实例和一个 MailConsumer 实例处理
  • 应发布消息一次,而不是每个队列一次(如果可能)
  • 如果没有消费者连接,消息应该排队直到被消费,而不是被丢弃

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

queues

这应该很容易做到,但我无法从文档中弄清楚。看来fanout example应该可以,但我对这些“匿名队列”感到困惑,这似乎会导致向每个消费者发送相同的消息。

最佳答案

如果您创建的队列没有自动删除标志,那么即使消费者断开连接,队列也将保持 Activity 状态。

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

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

使用fanout交换类型不是强制性的。如果需要,您还可以使用 topic 来更好地处理消息路由。

UPD:逐步获取架构所显示内容的方法。

  1. 声明持久交换,例如main,如 exchange.declare (exchange-name=main、type=fanout、durable=true)
  2. Delcare 有两个队列,例如文件邮件,如 queue.declare (queue-name=files, Durable=true)queue.declare (queue-name=mails, Durable=true)
  3. 将两个队列绑定(bind)为 queue.bind 进行交换(queue-name=files, Exchange-name=main)queue.bind (队列名称=邮件,交换名称=主)

此时,您可以将消息发布到 main 交换(请参阅上面有关 delivery-mode 的注释),并使用来自队列、文件的任何消费者号码进行消费FileConsumer 以及来自 mailsMailConsumer。如果队列上没有任何消费者,消息将排队并保留在队列中,直到它们被消耗(或者代理重新启动,因为它们不是持久性的)。

关于java - 如何使用工作队列行为发布到多个队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26650128/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com