38

メッセージ キューが既に存在するかどうかを確認するにはどうすればよいですか?

2 つの異なるアプリケーションがあります。1 つはキューを作成し、もう 1 つはそのキューから読み取ります。

したがって、最初にキューから読み取るクライアントを実行すると、クラッシュします。
それを避けるために、最初にキューが存在するかどうかを確認したいと思います。

キューを読み取る方法のコード スニペットを次に示します。

QueueingBasicConsumer <ConsumerName> = new QueueingBasicConsumer(<ChannelName>); 
<ChannelName>.BasicConsume("<queuename>", null, <ConsumerName>); 
BasicDeliverEventArgs e = (BasicDeliverEventArgs)<ConsumerName>.Queue.Dequeue();
4

6 に答える 6

74

チェックしないでください。

queue.declare はべき等操作です。したがって、1 回、2 回、N 回実行しても、結果は同じになります。

キューが存在することを確認したい場合は、使用する前に宣言してください。毎回同じ耐久性、排他性、自動削除性で宣言するようにしてください。そうしないと、例外が発生します。

実際にキューが存在するかどうかを確認する必要がある場合 (通常は必要ありません)、キューのパッシブ宣言を行います。その操作は、キューが存在する場合は成功し、存在しない場合はエラーで失敗します。

于 2010-08-11T10:53:00.170 に答える
6

これは、q 宣言を担当する他の誰か (他のアプリケーション) がいる状況では機能しません。そして、名前だけで、qのすべてのパラメーターを知ることができませんでした。

私はむしろpassiveDeclareを使用し、qが存在しないというIOExceptionをチェックしたいと思います

于 2014-03-24T09:12:47.317 に答える
6

現在、 RabbitMQ Management HTTP APIを通じて、その情報やその他の情報を知ることができます。

たとえば、現時点で 1 つのキューが稼働しているかどうかを確認するには、API の GET /api/queues/vhost/nameインターフェイスを呼び出すことができます。

于 2015-01-01T18:24:30.220 に答える
4

以下のコードを try catch セクション内に配置します。キューまたは交換が存在しない場合、エラーがスローされます。存在する場合、何もしません。

  var channel = connection.CreateModel();


  channel.ExchangeDeclarePassive(sExchangeName);

  QueueDeclareOk ok = channel.QueueDeclarePassive(sQueueName);

   if (ok.MessageCount > 0)
    {
      // Bind the queue to the exchange

     channel.QueueBind(sQueueName, sExchangeName, string.Empty);
    }
于 2019-03-25T13:17:17.180 に答える