The example code for RabbitMQ states
Our code will block while our $channel has callbacks. Whenever we receive a message our $callback function will be passed the received message.
With this code snippet
while(count($channel->callbacks)) {
$channel->wait();
}
This confuses me, because the default timeout for PhpAmqpLib\Channel\AbstractChannel::wait
is forever.
public function wait($allowed_methods = null, $non_blocking = false, $timeout = 0)
So if wait
blocks forever, how would the code ever reach a second iteration of the while
loop?
Would it be safe to say the while
loop is only necessary if wait
is passed a $timeout > 0
?
The timeout parameter on the wait
call is how long to wait for the next message before giving up. The default value, as you say, is "forever", which means "until a message arrives".
However, once a single message has been received and processed, the wait
call exits; it could perhaps be named waitForNextEvent()
. You can see that in the source you linked to:
if ($this->should_dispatch_method($allowed_methods, $method_sig)) {
return $this->dispatch($method_sig, $args, $amqpMessage);
}
So to receive more than one message, you need to call wait()
more than once. Generally, in a consumer, you want to call it an infinite number of times, so you could just use while(true)
, but allowing the loop to exit if you unregister all your callbacks gives you a way of gracefully exiting.