Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何发布到具有工作队列行为的多个队列?_Java_Rabbitmq - Fatal编程技术网

Java 如何发布到具有工作队列行为的多个队列?

Java 如何发布到具有工作队列行为的多个队列?,java,rabbitmq,Java,Rabbitmq,使用RabbitMQ,我有两种类型的使用者:FileConsumer将消息写入文件和MailConsumer邮件。每种类型可能有多个使用者,例如三个正在运行的MailConsumers和一个FileConsumer实例 我如何做到这一点: 每个已发布的消息都应该由一个FileConsumer实例和一个MailConsumer实例来处理 发布消息应执行一次,而不是每个队列执行一次(如果可能) 如果未连接任何使用者,则消息应排队等待,直到被消费,而不是丢弃 我应该使用什么类型的交换等来获得这种行

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

我如何做到这一点:

  • 每个已发布的消息都应该由一个FileConsumer实例和一个MailConsumer实例来处理
  • 发布消息应执行一次,而不是每个队列执行一次(如果可能)
  • 如果未连接任何使用者,则消息应排队等待,直到被消费,而不是丢弃
我应该使用什么类型的交换等来获得这种行为?我真的希望看到一些示例/伪代码来说明这一点


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

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

请注意,若您将队列声明为持久性的,那个么即使在代理重新启动之后,它也将存在

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

使用
fanout
交换类型不是强制性的。如果需要,您还可以使用
主题
,以更好地处理邮件路由

UPD:一步一步地获得您用模式显示的内容

  • 声明持久交换,比如说
    main
    ,作为
    (交换名称=main,类型=fanout,持久=true)
  • Delcare两个队列,例如,
    文件
    邮件
    作为
    (队列名称=文件,持久=真)
    (队列名称=邮件,持久=真)
  • 将两个队列绑定到exchange,分别为
    (队列名称=文件,exchange名称=主)
    (队列名称=邮件,exchange名称=主)

  • 此时,您可以将消息发布到
    main
    exchange(请参阅上文关于
    交付模式的说明),并使用队列中的任何消费者号码、使用
    FileConsumer
    文件中的
    以及使用
    mailcsumer
    邮件中的
    消费。如果队列中没有任何使用者,消息将排队并保持在队列中,直到它们被消费(或者代理重新启动,因为它们不是持久的)。

    好的,这很有帮助。但我需要更多的细节,如何设置发布者和消费者,使其与问题中的一样工作。编辑步骤以获得类似的图表。真正的代码将取决于您使用的客户端库和平台。