В настоящее время я реализую некоторую логику после получения сообщения от rabbitMQ с использованием basic_get без автоматической отправки подтверждения получения сообщений.
Согласно учебнику Вот (Раздел подтверждения сообщения), я не могу найти ссылку на канал в самой msg и отправить подтверждение, как упомянуто в ссылке выше:
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
Это потому, что в моем массиве информации о доставке сообщений нет такого канала.
Интересно, как могло случиться, что это отсутствует.
редактировать: фрагмент кода основного получения
$msg = $this->channel->basic_get($this->queueName, false);
Вот var_dump моего сообщения: (Желтая часть)
L
Согласно спецификации AMQP get-ok
который является возвращаемым значением basic-get
не включает канал, в отличие от того, что происходит с basic-deliver
, который используется, когда приходит сообщение для потребителя, начинающегося с basic-consume
,
Так что поведение библиотеки правильное.
Увидеть https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Channel/AMQPChannel.php#L1022
против
https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Channel/AMQPChannel.php#L956
При использовании basic_get (который, кажется, не рекомендуется, вместо этого используйте basic_consume), попробуйте получить сообщение напрямую из канала с помощью delivery_tag.
$ This-> channel-> basic_ack ($ msg-> delivery_info [ ‘delivery_tag’]);