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, он будет ждать / прослушивать / зацикливать эти сообщения вечно.