RabbitMQ在启动时从队列中获取一条消息

时间:2017-06-09 06:39:22

标签: rabbitmq

当工作人员关闭时,我在RabbitMQ中向队列发布了许多消息。 然后我启动我的工作人员,他从队列中获取所有消息,并且他工作正常但是当我在他结束之前停止我的工作程序时,所有消息都从队列中删除。 如果我从同一个工人开始,他就没有消息可以接受。

$channel->queue_declare($action, false, false, false, false);

$channel->basic_qos(null, 1, null);
$channel->basic_consume($action, '', false, true, false, false, $callback);

我怎么办我的工作人员从队列开始只收到一条消息,当工人停止和开始时,他继续从他停止的队列中接收消息?

1 个答案:

答案 0 :(得分:0)

如果没有留言,则消息已被确认。

"自动确认"应该禁用,以便必须手动明确地发回确认(即完成所有工作后)以完成消费。

$no_ack = false; # If no_ack is true the server does NOT expect a
                 # basic.ack response and will dequeue the message immediately!
$channel->basic_consume($action, '', false, $no_ack, false, false, $callback);

PHP tutorial on the RabbitMQ site显示了如何从回调中发送确认。

只要工作人员在之前被杀,就会发送确认消息,当连接关闭时,该消息将再次可用 - 并且可以被其他消费者接收。请参阅Message Acknowledgements

具体来说,no-ack位:

  

如果设置此字段(true),则服务器不会期望对消息进行确认。也就是说,当消息传递到客户端时,服务器会假定传递将成功并立即将其出列。此功能可能会提高性能,但代价是可靠性。如果客户端在交付给应用程序之前死亡,则消息可能会丢失。