Сохраняйте сообщения от ACKing на get () с помощью pecl-amqp - PullRequest
1 голос
/ 11 июня 2011

Я пытаюсь использовать pecl-amqp для моего проекта. У меня проблемы с процессом ACK. Мне нужно вручную подтверждать каждое сообщение, которое я получаю из очереди, но сообщения, как представляется, автоматически получают ACK при получении сообщения.

Я установил для своей очереди значение AMQP_NOACK и использую AMQPQueue-> get (AMQP_NOACK), но, похоже, это ни на что не влияет, сообщения по-прежнему удаляются из очереди без отправки AMQPQueue-> ack ().

Если у кого-то есть опыт работы с pecl-amqp, я был бы признателен за помощь.

Ответы [ 2 ]

1 голос
/ 26 июля 2011

У меня была та же проблема, но мне удалось заставить механизм подтверждения работать с использованием метода потребления. Использование rabbitmqctl для перечисления записей в очереди, кажется, работает нормально, хотя я, кажется, получаю сообщения из очереди в порядке, отличном от того, в котором они были отправлены - что побеждает объект очереди. Мой код выглядит следующим образом:

// Create the queue to be:
//      AMQP_DURABLE - messages will withstand a broker restart (i.e. they are written to disk).
//      AMQP_NOACK - when consumed messages will not be marked as delivered until an explicit ACK is received.
$q->declare($queueName, AMQP_DURABLE | AMQP_NOACK );

// Bind it on the exchange to routing key.
$q->bind($exchangeName, $routingKey);

// Set the options for our consumption of the messages:
//  Get a minimum of 0 msg.
//  Get a maximum of 1 msg.
//  Don't ACK the message on consumption i.e. explicitly acknoledge later.
$options = array(
 'min' => 0,
 'max' => 1,
 'ack' => false
);
// Get the messages
$results_array = $q->consume($options);

// show the message
print_r($results_array);
$delivery_tag =  $results_array[0]['delivery_tag'];
echo 'delivery_tag: [' . $delivery_tag . "].\r\n";

// Acknowledge receipt of the message.
$q->ack($delivery_tag);
0 голосов
/ 17 октября 2011

Для справки: расширение AMQP не поддерживает AMQP_NOACK правильно. Вы можете заставить его делать то, что вы хотите, но это не красиво. Я работаю над исправлением этого сейчас. К вашему сведению, AMQP_NOACK означает, что вам не придется возвращаться для подтверждения сообщения позже, то есть, как только сервер отправляет сообщение клиенту, сервер помечает сообщение как подтвержденное. Вокруг этого возникла путаница, поэтому я хотел уточнить.

...