我正在尝试将pecl-amqp用于我的项目。我在ACK过程中遇到了困难。我需要手动确认从队列中收到的每条消息,但是当检索到消息时,消息似乎是自动确认。
我已将队列设置为AMQP_NOACK并使用AMQPQueue-> get(AMQP_NOACK),但似乎没有任何影响,消息仍然从队列中删除,而我没有发送AMQPQueue-> ack()
如果有人对pecl-amqp有任何经验,我将不胜感激。
答案 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意味着您不必再回来确认该消息,即一旦服务器将消息发送到客户端,服务器就会将消息标记为已确认。围绕这一点存在一些混淆,所以我想澄清一下。