2017-06-09 55 views
0

当员工关闭时,我会在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); 

我可以做我的工作人员是如何发生的开始只有一个消息队列,从当工人停止,并开始他继续从队列中,他停止采取的消息?

回答

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显示了如何从回调中发送ack。

只要工作人员在之前遇害确认已发送,该消息将在连接关闭时再次可用 - 并且可以由其他消费者接收。见Message Acknowledgements

具体来说,WRT的no-ack位:

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

+0

它看起来不错,但我不知道现在我怎么能发回消息是完全消耗的信息。 –

+0

@BartekPieczonka使用'bacic_ack'方法(对应于'basic.ack'命令)。 PHP库文档是..废话,但它是不同的客户端相同的原则。请参阅https://www.rabbitmq.com/tutorials/tutorial-two-php.html并注意'$ msg-> delivery_info ['channel'] - > basic_ack($ msg-> delivery_info ['delivery_tag']);' – user2864740

+0

是的,现在很好,非常感谢!你太棒了。 –

相关问题