【问题标题】:How can consumer listen to all queues present in a channel simultaneously without knowing queue names in php rabbitmq消费者如何在不知道 php rabbitmq 中的队列名称的情况下同时收听通道中存在的所有队列
【发布时间】:2015-08-06 08:59:59
【问题描述】:

我试图让消费者在 consumer.php 中的无名交换中收听所有队列,但我必须提及队列名称,如图所示:

$this->channel->basic_consume('Cancelcontact', '', false, false, false, false, array($this, 'processMsg'));
$this->channel->basic_consume('Acceptcontact', '', false, false, false, false, array($this, 'processMsg'));
$this->channel->basic_consume('Declinecontact', '', false, false, false, false, array($this, 'processMsg'));

有没有办法获取通道中所有队列的名称并为相同目的编写单个基本消费??

【问题讨论】:

    标签: php rabbitmq


    【解决方案1】:

    即使有可能,也是个坏主意。

    拥有多个队列允许您拥有多个消费者,每个消费者都可以处理特定类型的消息。通过让所有队列都发送给同一个使用者,您的代码将不得不检查消息的类型以确定如何处理它。

    这是对 RabbitMQ 已经为您完成的工作的重复,可能会将您置于“选择性消费者”模式 - an anti-pattern in RabbitMQ

    处理AcceptContactCancelContact 消息的过程会有所不同。因此,处理这些消息的代码会有所不同。

    让处理AcceptContact 消息的代码仅从AcceptContact 队列中消费。让可以处理CancelContact 消息的代码只消耗来自CancelContact 队列。

    【讨论】:

    • 就我而言,我希望我的消费者收听所有队列。我在同一个消费者类中为每种类型的消息指定了不同的函数(Cancelconatct、Acceptcontact、....)。所以我需要运行 2 个消费者类实例。有什么办法让消费者可以监听频道中的所有队列?
    • 您可以在同一个实例/进程中拥有多个消费者。每次调用“basic_consume”(或您使用的任何“订阅”方法)都是消费者。这没有什么问题。但是您需要为每个队列创建一个消费者。无法自动监听所有队列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2016-05-21
    • 2012-10-17
    • 2020-03-17
    • 1970-01-01
    相关资源
    最近更新 更多