PHP Amqp канал обратного вызова цикла

Пример кода для состояний RabbitMQ

Наш код будет блокироваться, в то время как наш $ канал имеет обратные вызовы. Всякий раз, когда мы получаем сообщение, нашей функции $ callback будет передано полученное сообщение.

С этим фрагментом кода

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

Это смущает меня, потому что тайм-аут по умолчанию для PhpAmqpLib\Channel\AbstractChannel::wait навсегда.

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

Так что если wait блоки навсегда, как код достигнет второй итерации while цикл?

Можно ли сказать, что while цикл необходим только если wait передан $timeout > 0?

2 ответа

Решение

Параметр времени ожидания на wait Звоните, как долго ждать следующего сообщения, прежде чем сдаться. Значение по умолчанию, как вы говорите, "навсегда", что означает "пока не прибудет сообщение".

Однако, как только одно сообщение было получено и обработано, wait вызовы выходов; это может быть названо waitForNextEvent(), Вы можете видеть это в источнике, на который вы ссылались:

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

Таким образом, чтобы получить более одного сообщения, вам нужно позвонить wait() больше чем единожды. Как правило, в потребителе вы хотите назвать это бесконечное количество раз, так что вы можете просто использовать while(true), но разрешение выхода из цикла, если вы отменили регистрацию всех своих обратных вызовов, дает вам возможность грациозного выхода.

Код, который вы показываете, будет представлять работника или обработчика сообщений AMQP

Поскольку он будет прослушивать пропущенные сообщения с сервера AMQP, он будет ждать / прослушивать / зацикливать эти сообщения вечно.

Другие вопросы по тегам