使用pecl-amqp保持来自get()的ACK消息

时间:2011-06-11 18:13:19

标签: php rabbitmq amqp

我正在尝试将pecl-amqp用于我的项目。我在ACK过程中遇到了困难。我需要手动确认从队列中收到的每条消息,但是当检索到消息时,消息似乎是自动确认。

我已将队列设置为AMQP_NOACK并使用AMQPQueue-> get(AMQP_NOACK),但似乎没有任何影响,消息仍然从队列中删除,而我没有发送AMQPQueue-> ack()

如果有人对pecl-amqp有任何经验,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但设法使用consume方法使用确认机制。使用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);

答案 1 :(得分:0)

作为参考,AMQP扩展不正确支持AMQP_NOACK。你可以让它做你想做的事,但它并不漂亮。我正在努力解决这个问题。仅供参考,AMQP_NOACK意味着您不必再回来确认该消息,即一旦服务器将消息发送到客户端,服务器就会将消息标记为已确认。围绕这一点存在一些混淆,所以我想澄清一下。