2016-02-16 8 views
6

既存のキューのコンシューマを書き込もうとしています。すべてのプロパティを指定せずにキューを取得する

RabbbitMQは別のインスタンスで実行されており、「org-queue」という名前のキューはすでに作成され、Exchangeにバインドされています。 org-queueは耐久性のあるキューで、いくつかの追加プロパティもあります。

このキューからメッセージを受信する必要があります。 は、私はそれが私に別の耐久性の性質を示すエラーがスローされますキュー

conn = Bunny.new 
conn.start 
ch = conn.create_channel  
q = ch.queue("org-queue") 

のインスタンスを取得するには、以下のコードを使用しています。デフォルトでは、Bunnyはdurable = falseを使用しているようです。だから私はパラメータとして耐久性trueを追加しました。今は、他のパラメータの違いを述べています。接続するためにすべてのパラメータを指定する必要がありますか? rabbitMQはさまざまな環境で維持されているので、すべてのプロパティを取得するのは難しいです。

すべてのパラメータでキューに接続するのではなく、キューのリストを取得してクライアントで必要なキューをリッスンする方法はありますか。

+0

通常、メッセージバスに接続するときは、契約を知っているはずなのに、あなたはそれを動的に実行する必要があります。さまざまな問題を引き起こす可能性があり、非常に難しいでしょう。私はそれをお勧めしません – Anthony

+0

私はそれをもう一度。キューを環境変数のどこかに設定し、それらを使用してキュー/交換に接続するためのパラメータを用意する必要があります。 – LukeS

答えて

1

queue()で:passive = trueパラメータを試したことがありますか?実際の例はrabbitmq plugin of logstashです。 :パッシブとは、メッセージを消費するときにキューの存在を宣言するのではなく、キューの存在をチェックすることだけです。

0

おそらく、rabbitmqctlまたは管理ツール(私は名前を忘れてしまったので)を入手する方法があるので、キューに関する情報です。たとえそうでも、私は気にしません。

私の考えには2つの解決策があります。

まず解決策:一般的に

すでに既存のキューを宣言したい場合は、それがすべて正しいパラメータでなければなりません。だから、私がやっていることは、特定のキューを宣言するためのヘルパー関数を持っていることです(私はC++クライアントを使用しているので、APIは異なるかもしれませんが、コンセプトは同じです)。例えば、私がqueue1を消費している加入者が10人あり、それぞれが同じ方法でキューを宣言する必要がある場合、このキューを宣言するutilを書くだけです。少し何か第二の溶液の前に


:たぶんここは、私たちがあまりにも頻繁に起こる:) あなたは本当にからメッセージを取得するために、特定のキューを必要としない誤解に来た場合でありますそのキュー。必要なのは、のキューと正しいバインドです。メッセージを送るとき、あなたは本当に待ち行列に送るのではなく、交換機に、時にはルーティングキーを使って、時にはそれを使わずに - 言いましょう。受信側では、メッセージを消費するキューが必要なので、当然、メッセージを宣言し、それをルーティングキーでExchangeにバインドします。明示的にキューの名前を必要とする必要はありません。サーバーは一般的なものを提供するので、バインド時に使用することができます。


第二の溶液: (ここではhttps://www.rabbitmq.com/tutorials/tutorial-four-java.htmlた)同じ結合 キー

で複数のキューをバインドすることは完全に合法である

という事実に依存していますだからあなたの加入者のそれぞれは、あなたが望むどんな方法であれ、キューを束縛することができます間違いなくもちろん、これらは異なる名前の異なるキューになります。 I は、を推奨しません。これは、すべてのメッセージが2つのキュー(たとえば、おそらく1つのサブスクライバによって1回のみ処理される必要があると仮定しています)のメッセージになります。あなたは、そのチャネル上のすべてのキューのハッシュを得ることができるch.queues()メソッドを使用して

ここドキュメント http://reference.rubybunny.info/Bunny/Queue.htmlに基づき
1

http://reference.rubybunny.info/Bunny/Channel.html

。次に、接続しようとしているキューのインスタンスが見つかったらq.options()メソッドを使用して、そのrabbitmqキューにあるオプションを調べることができます。

これを行う方法についてのラウンドのようですが、うまくいくかもしれません。現時点では私はrabbitmqサーバを持っていないので、これをテストしていません。

+0

私のために、ch.queues()は空のハッシュを返しますが、キューは私のrabbitMQサーバーにあります – sag

関連する問題