1

RabbitMQ状态的示例代码

当我们的 $channel 有回调时,我们的代码将阻塞。每当我们收到一条消息时,我们的 $callback 函数都会收到收到的消息。

使用此代码段

while(count($channel->callbacks)) {
    $channel->wait();
}

这让我很困惑,因为默认超时PhpAmqpLib\Channel\AbstractChannel::wait是永远

public function wait($allowed_methods = null, $non_blocking = false, $timeout = 0)

因此,如果wait永远阻塞,代码将如何到达while循环的第二次迭代?

是否可以安全地说循环仅在传递 awhile时才是必要的?wait$timeout > 0

4

2 回答 2

2

调用的超时参数是在放弃之前wait等待下一条消息的时间。正如您所说,默认值是“永远”,这意味着“直到消息到达”。

但是,一旦收到并处理了一条消息,wait调用就会退出;它也许可以被命名waitForNextEvent()。您可以在链接到的源中看到:

if ($this->should_dispatch_method($allowed_methods, $method_sig)) {
    return $this->dispatch($method_sig, $args, $amqpMessage);
}

因此,要接收多条消息,您需要wait()多次调用。通常,在消费者中,您希望无限次调用它,因此您可以只使用while(true),但如果您取消注册所有回调,则允许循环退出为您提供了一种优雅退出的方式。

于 2017-04-24T14:35:05.013 回答
0

您显示的代码将代表 AMQP 消息的工作人员或处理器

因为它将侦听来自 AMQP 服务器的丢弃消息,所以它将永远等待/侦听/循环这些消息。

于 2017-03-21T16:55:38.363 回答