Java 如何发布到具有工作队列行为的多个队列?
使用RabbitMQ,我有两种类型的使用者:FileConsumer将消息写入文件和MailConsumer邮件。每种类型可能有多个使用者,例如三个正在运行的MailConsumers和一个FileConsumer实例 我如何做到这一点:Java 如何发布到具有工作队列行为的多个队列?,java,rabbitmq,Java,Rabbitmq,使用RabbitMQ,我有两种类型的使用者:FileConsumer将消息写入文件和MailConsumer邮件。每种类型可能有多个使用者,例如三个正在运行的MailConsumers和一个FileConsumer实例 我如何做到这一点: 每个已发布的消息都应该由一个FileConsumer实例和一个MailConsumer实例来处理 发布消息应执行一次,而不是每个队列执行一次(如果可能) 如果未连接任何使用者,则消息应排队等待,直到被消费,而不是丢弃 我应该使用什么类型的交换等来获得这种行
- 每个已发布的消息都应该由一个FileConsumer实例和一个MailConsumer实例来处理
- 发布消息应执行一次,而不是每个队列执行一次(如果可能)
- 如果未连接任何使用者,则消息应排队等待,直到被消费,而不是丢弃
这应该很容易做到,但我无法从文档中找到答案。这似乎应该是可行的,但我对这些“匿名队列”感到困惑,它们似乎会导致向每个消费者发送相同的消息。如果您创建的队列没有
自动删除
标志,那么即使消费者断开连接,队列也会保持活动状态
请注意,若您将队列声明为持久性的,那个么即使在代理重新启动之后,它也将存在
如果您将发布带有delivery mode=2
属性集的消息(这意味着消息将是持久的),则即使在代理重新启动后,此类消息仍将保持在持久(这对于使队列持久化很重要)队列中
使用fanout
交换类型不是强制性的。如果需要,您还可以使用主题
,以更好地处理邮件路由
UPD:一步一步地获得您用模式显示的内容
main
,作为(交换名称=main,类型=fanout,持久=true)
文件
和邮件
作为(队列名称=文件,持久=真)
和(队列名称=邮件,持久=真)
(队列名称=文件,exchange名称=主)
和(队列名称=邮件,exchange名称=主)
此时,您可以将消息发布到
main
exchange(请参阅上文关于交付模式的说明),并使用队列中的任何消费者号码、使用FileConsumer
从文件中的以及使用mailcsumer
从邮件中的消费。如果队列中没有任何使用者,消息将排队并保持在队列中,直到它们被消费(或者代理重新启动,因为它们不是持久的)。好的,这很有帮助。但我需要更多的细节,如何设置发布者和消费者,使其与问题中的一样工作。编辑步骤以获得类似的图表。真正的代码将取决于您使用的客户端库和平台。