2017-06-09 91 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

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

相關問題