Как я могу проверить, существует ли очередь сообщений RabbitMQ или нет? - PullRequest
26 голосов
/ 11 августа 2010

Как проверить, существует ли очередь сообщений или нет?

У меня есть 2 разных приложения, одно из которых создает очередь, а другое читает из этой очереди.

Так что, если я запустил Клиент, который сначала читает из очереди, то он зависает.
Поэтому, чтобы избежать этого, я хотел бы сначала проверить, существует очередь или нет.

Вот фрагмент кода того, как я читаю очередь:

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

Ответы [ 5 ]

53 голосов
/ 11 августа 2010

Не беспокойтесь о проверке.

queue.declare является идемпотентной операцией. Итак, если вы запустите его один раз, два раза, N раз, результат останется прежним.

Если вы хотите убедиться, что очередь существует, просто объявите ее перед использованием. Убедитесь, что вы объявляете его с одинаковой долговечностью, эксклюзивностью, автоматическим удалением каждый раз, иначе вы получите исключение.

Если вам действительно нужно проверить, существует ли очередь (обычно это не нужно), сделайте пассивное объявление очереди. Эта операция завершается успешно, если очередь существует, или приводит к ошибке, если ее нет.

4 голосов
/ 01 января 2015

В настоящее время вы можете знать эту информацию и многое другое API-интерфейс управления RabbitMQ HTTP .

Например, чтобы узнать, работает ли одна очередь в данный момент, вы можете вызвать интерфейс API GET / api / queues / vhost / name .

3 голосов
/ 24 марта 2014

Это не будет работать в ситуациях, когда кто-то (другое приложение) отвечает за объявление q.И я просто не мог знать все параметры q, только имя.

Я бы предпочел использовать passiveDeclare и проверить IOException, что q не существует

1 голос
/ 23 августа 2017

Используйте QueueDeclare (), чтобы выполнить это, как предложено.Кроме того, мы всегда делали так, чтобы потребитель очереди был владельцем очереди и всегда публиковался на биржах, которые созданы и принадлежат издателям.Затем потребители связывают свои очереди с биржами, от которых они хотят получать трафик, и используют соответствующий фильтр ключа маршрута для трафика, который они хотят.Таким образом, издатели приглушаются отсутствием потребителей для недолговечных очередей, и потребители могут свободно приходить и уходить с длительными или недолговечными очередями, сопоставленными с соответствующими ключами маршрута.

Это приводит к легко администрируемомусистема и позволяет использовать веб-администрацию для создания долговременной очереди и ее привязки к обмену, получения трафика, отмены привязки и проверки содержимого очереди, чтобы понять, какой трафик и нагрузка поступают через обмен.

0 голосов
/ 25 марта 2019

Поместите ниже код внутри секции 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);
    }
...