2016-12-29 10 views
0

私はRabbitMQからのメッセージを処理できる作業者に取り組んでいます。MQRabbit Queueの最後にメッセージを入れる方法

しかし、私はこれを達成する方法が不明です。

エラーメッセージが表示され、処理中にエラーが発生した場合、どのようにメッセージをキューの最後に置くことができますか?

私はnackや拒否を使用しようとしていますが、メッセージは常に最初の位置に再入力され、他のメッセージはフリーズします。

メッセージが最初の位置になければならない理由はわかりませんが、私はキューまたはAllupToのような他のオプションで "再生"しようとしていますが、どれも動作していないようです。

ありがとうございます!

答えて

0

nackまたはrejectは、メッセージを破棄したり、メッセージを再キューしたりします。下記のご要望は、適切な可能性のために

消費者が直前にバックRabbitMQのサーバへ)、その処理を開始する(ACKを送信する、メッセージを受信すると。

メッセージを処理した後、プロセスでエラーが見つかった場合は、同じメッセージを同じキューに送信(公開)します。これにより、メッセージがキューの後ろに置かれます。

成功した処理では何もしません。 ack()はすでにrabbitmqサーバに送られています。次のメッセージを受け取り、処理してください。

+0

なぜack()は処理されたメッセージもエラーもありませんか?メッセージが処理された後で肯定応答が返されなければなりません。そうでない場合、処理前または処理中や処理中に問題が発生した場合、このメッセージは失われてキューから削除されます。メッセージを再キューに入れるか破棄するかは、メッセージを拒否して決定する必要があります。 –

+0

処理前または処理後のメッセージをack()するときは、そのすべてがビジネス要件に依存します。 スクリプトが終了/終了する前に実行する最後のフェールオーバーコードとしてエラーまたは例外が発生した場合、メッセージをキューに戻すことができます。 キューの後ろにメッセージを置くシナリオがあり、すべてではない場合、 は処理後にack()/ nack()/ republishを保持できます。 処理の最後に、最後にack/nackを選択するか、メッセージを再発行することができます。 –

1

Documentationは言う:

メッセージを再キューイングパラメータ(basic.recover、basic.rejectと basic.nack)が備わっていますAMQPメソッドを使用して、キューに、または、チャネルのクローズ中に戻すことができ、未確認のメッセージを保持 メッセージ。これらのシナリオでは、RabbitMQリリース2.7.0より前のキューの キューにメッセージが再キューされました。 RabbitMQリリース2.7.0から、メッセージはキュー内で常に の発行順に保持されます。キューが存在する場合や、チャネルが の場合でも閉じられます。

リリース2.7.0以降では、キューに複数の サブスクライバが存在する場合、個別のメッセージが順不同のメッセージを監視する可能性があります。これは、 メッセージを再入力する可能性のある他のユーザの動作によるものです。キューの観点からは、メッセージは常に であり、発行順序は常に保持されます。

あなたの成功したメッセージはackであることを覚えておいてください。それ以外の場合はキューから削除されません。

拒否されたメッセージをさらに制御する必要がある場合は、dead letter exchangesをご覧ください。

関連する問題