2013-03-08 18 views
6

耐久性のあるキューとそのバインディングを維持するが、その消費者を一時停止するための最良の方法は何を中断RabbitMQの?キュー消費

ユースケースは次のとおりです。対処できないメッセージ(たとえば、データベースがダウンしているか、スキーマに問題がある)が増え続ける場合は、「クラッシュさせて」メッセージを処理しないようにしたいと思いますが、キューに集約し続けるそれは公開することができますが、消費は中断します。

私は3つの解決策を考えることができます:私はキューにバインドされたすべての消費者が継続的にメッセージや再キューを拒否したが、これは廃棄物資源の一種ではありませんへの言及私はプログラム的に行ういる可能性があり

  1. 上記のロジック。
  2. 私はキューにバインドされているすべてのSimpleMessageListenerContainersshutdownを呼び出すことができると思い
  3. それともの面で(下記参照)、すべての消費者にbasic.cancelConsumerを呼び出すことができます。

#1メッセージが拒否されているため、既に実行しています。問題は、無限ループの失敗のようになり、失敗した場合にはより多くのリソースを浪費することになります。

#3は理想的なようだが、私は、すべてのメッセージリスナについて知った後、シャットダウンすることを通知しているか、いくつかに持っています。キューを中断する必要があることを通知するためにファンアウト交換機を使用することができます。私はRabbitMQがこのロジックのために何かを組み込む必要があるように感じます。もう1つの問題は、複数のキューをメッセージコンテナにバインドできることです(すべてのキューを中断する必要はない可能性があります)。 #2については

私はそのconsumerTagcancel the consumerことができます知っているが、私はキューにconsumerTagのリストを得るのですかどこ(つまり、上記の操作を行うための正しい方法であると仮定した場合)の質問はありますか?

答えて

1

あなたが消費者を停止する必要がある場合は、ちょうどそれはそれを行う方法ですが、基本的なキャンセルを呼び出します。

キューを宣言するときに恒久キューを解決することは、durable=trueauto_delete=falseです。永続メッセージを持つ

は、あなたがそれらを公開する際に決定されます。delivery_mode=2.

各消費者はそれ自身の消費者のタグを持っています。キューからメッセージを受け取るたびに、エンベロープにコンシューマータグが含まれていて、そのタグで基本キャンセルを呼び出す必要があります。

私の知る限り、あなたはCONN 1に、消費者のAを持っており、基本的な別の接続でその消費者のためにキャンセル呼び出すことはできません。私はこれに間違っているかもしれない。

+0

感謝。私は上記のようにウサギで待ち行列を宣言する方法を知っています。それは私がすでに落ちている道である私の消費者を私自身で管理しなければならないように見える。ウサギが管理者の方が賢明にキューの使用を中断することができればうれしいでしょう。 –

+0

接続から唯一できることは、あなたが探しているものではない管理者から強制的に閉じることです –

1

このソリューションは、特定のです。基本的に答えは#3です。

キュー名のMap<String,CustomSimpleMessageListenerContainer>がカスタム拡張SimpleMessageListenerContainerのサービスを維持しています。

特定の量の例外が発生した後、サービスによって受信された特別なキューに移動して消費者をシャットダウンする「パニック」メッセージが送信されます。