2017-06-09 7 views
0

上のキューからメッセージを一つ取る作業員がオフのとき、私はRabbitMQの中に私のキューに多くのメッセージを公開します。 そして、私は私の労働者を起動して、彼はキューからすべてのメッセージを受け取り、彼は正常に動作しているが、彼が終了する前に、私は私のワーカープロセスへを停止すると、すべてのメッセージがキューから削除されます。 私が同じ仕事を2番目に開始した場合、彼は取るべきメッセージがありません。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を送信する方法を示しています。

の前にのackが送信されている間は、接続が閉じられたときにメッセージが再び利用可能になり、他のコンシューマーが取り上げることができます。 Message Acknowledgementsを参照してください。

具体的には、WRT no-ackビット:

このフィールドは、サーバーがメッセージに対する確認応答を期待していない(真)に設定されている場合。つまり、メッセージがクライアントに配信されると、サーバーは配信が成功したものとみなしてすぐにデキューします。この機能はパフォーマンスを向上させる可能性がありますが、信頼性を犠牲にします。クライアントがアプリケーションに配信される前に死亡した場合、メッセージが失われる可能性があります。

+0

それはよさそうだが、私はそのメッセージが消費された完全な情報を送り返すことができますどのように今を知りません。 –

+0

@BartekPieczonka使用( 'basic.ack'コマンドに対応する)' bacic_ack'方法。 PHPライブラリのドキュメントはなんとなくわかりますが、異なるクライアント間でも同じ原理です。 ';([ 'delivery_tag'] delivery_info $ msg->)> basic_ack - [ 'チャンネル'] delivery_info https://www.rabbitmq.com/tutorials/tutorial-two-php.htmlと注意し' $ msg->を参照してください。 – user2864740

+0

ええ、今、うまくいってくれてありがとう!あなたは素晴らしいです。 –

関連する問題