2017-04-06 9 views
1

私は、コンシューマがキューから取得したメッセージを処理し、キューに再キューします。 FOO、バー、バズがメッセージですNabとRabbitMQの拒否

P => | foo | bar | baz | => C 

は、私はこのような状況を持っている想像してください。

コンシューマがbazを読み取っても問題が発生する場合は、basic.rejectまたはbasic.nackhttps://www.rabbitmq.com/nack.html)のいずれかを使用できます。これらの2つのコマンドのうちの1つを使用して、メッセージを再キューに入れる引数を渡します。

メッセージは以前と同じ位置に再キューされているため、次のメッセージは再びbazになります。

私はそれを再度キューが、キューの先頭に戻ってそれを送りたい:私は自分のアプリケーションのコードの一部の行で解決

P => | baz | foo | bar | => C 

、より良い解決策が存在する場合、私は多分使用して、疑問に思いますRabbitMQのいくつかの機能を直接的にサポートします。

答えて

1

あなたが不能キュー(DLQ)の表情を取ることができます。https://www.rabbitmq.com/dlx.html

+0

はい、私は昨日、全体のドキュメントを参照してください。これは私が探していたものではありませんが、私が探していたものは存在せず、デッドレターのキューは良い回避策になる可能性があります。 – xyzale

+0

ここで、待ち行列(FIFO)は、正確に予想どおりに動作します。手動のackモードを使用しているので、スレッドは処理に失敗すると、ackを取得するまで待機し、ループで同じ位置に置こうとします。一方、悪いメッセージを何度も何度も処理することは理にかなっていません。 2〜3回再試行(spring-amqpには直接サポートがあります)しても失敗した場合は、後で悪いメッセージのパターンを分析してクライアントチームに直接手を差し伸べることができます。 – lambodar

+0

は、失敗したメッセージにTTLを追加してDLXに入れることができるため、期限切れになると自動的にメインキューに移動します。 – lambodar

関連する問題