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

RabbitMQ在启动时从队列中获取一条消息,rabbitmq,Rabbitmq,当worker关闭时,我将许多消息发布到RabbitMQ中的队列中。 然后我启动我的工作者,他从队列中获取所有消息,他工作正常,但当我在工作者结束之前停止我的工作进程时,所有消息都会从队列中删除。 如果我第二次启动的是同一个工人,他就没有任何消息可以接收 $channel->queue_declare($action, false, false, false, false); $channel->basic_qos(null, 1, null); $channel->basi

当worker关闭时,我将许多消息发布到RabbitMQ中的队列中。 然后我启动我的工作者,他从队列中获取所有消息,他工作正常,但当我在工作者结束之前停止我的工作进程时,所有消息都会从队列中删除。 如果我第二次启动的是同一个工人,他就没有任何消息可以接收

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

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

如何处理我的工作人员在从队列开始时只接收一条消息,当工作人员停止并开始时,他继续从他停止的队列中接收消息?

如果没有要接收的消息,则消息已被确认

应禁用“自动确认”,以便确认必须手动明确发送回(即在所有工作完成后)以完成消息的使用

$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);
显示如何从回调中发送ack

只要在发送ack之前杀死了工作进程,那么当连接关闭时,消息将再次可用,并且可以被其他使用者拾取。看

具体而言,wrt位:

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


看起来不错,但我不知道现在如何才能发回消息已完成的信息。@BartekPieczonka使用
bacic_ack
方法(对应于
basic.ack
命令)。PHP库文档是。。废话,但不同客户之间的原则是一样的。请参阅并注意
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag'])