-
Notifications
You must be signed in to change notification settings - Fork 10
Description
This is just a placeholder for discussion regarding a new AMQP adapter (RabbitMQ, etc).
I did some prototyping of a new adapter using the SqsAdapter as a baseline and my preferred library (one of the best AFAIK): https://github.com/videlalvaro/php-amqplib.
I was able to enqueue and dequeue the messages rather easily, but have had trouble with acknowledge thus far. I'll continue to work on that and link to it when I have something functional.
The AMQP library recommends that consumers use $channel->basic_consume().
https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Channel/AMQPChannel.php#L898
This works by declaring a callback and the consumer will remain attached and receiving messages as long as the callback is registered.
The core logic looks roughly like this:
try {
// params: $queue, $consumer_tag, $no_local, $no_ack, $exclusive, $nowait, $callback
$channel->basic_consume($this->name, '', false, false, false, false, $callback);
} catch (Exception $e) {
// @TODO Channel setup exception
}
// Loop as long as the channel has callbacks registered
while (count($channel->callbacks)) {
try {
var_dump('waiting');
$channel->wait();
} catch (Exception $e) {
// @TODO Channel wait exception
}
}
I have not yet been able to dequeue using the above basic_consume logic which I think will be the best long-term approach for this new adapter. I'll circle back to this after I can get acknowledge working.
However, I was able to get the $channel->basic_get() operation to work within a loop yielding $factory->createMessage() items.
https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Channel/AMQPChannel.php#L981
The AMQP library doesn't recommend this due to inefficiencies (etc), but I have seen their maintainers suggest this method as an option for people trying to build their own blocking consumers.
A third option is also a possibility: $channel->batch_basic_publish()
https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Channel/AMQPChannel.php#L1115
I haven't used it myself and didn't know it was even available until last week.