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

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

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

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

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

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

person Jigar Sheth    schedule 11.08.2010    source источник
comment
вот фрагмент кода того, как я читаю очередь QueueingBasicConsumer ‹ConsumerName› = new QueueingBasicConsumer(‹ChannelName›); ‹ChannelName›.BasicConsume(‹queuename›, null, ‹ConsumerName›); BasicDeliverEventArgs e = (BasicDeliverEventArgs)‹ConsumerName›.Queue.Dequeue();   -  person Jigar Sheth    schedule 11.08.2010
comment
Я добавил этот фрагмент кода в ваш пост. В будущем при добавлении дополнительного контекста нажимайте ссылку редактировать вместо добавления комментария. Для получения дополнительной информации см. раздел Когда я должен комментировать? на странице справки. для комментариев.   -  person Sᴀᴍ Onᴇᴌᴀ    schedule 23.08.2017


Ответы (6)


Не утруждайте себя проверкой.

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

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

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

person scvalex    schedule 11.08.2010
comment
Не могли бы вы упомянуть синтаксис для пассивного объявления очереди в С# API - person Jigar Sheth; 11.08.2010
comment
Используйте IModel.QueueDeclare и установите для пассивного параметра значение true. rabbitmq.com/releases/rabbitmq-dotnet-client/v1.8.1/ - person scvalex; 11.08.2010
comment
Действительно? Я только что попытался использовать С# QueueDeclare(); и он создал две идентичные очереди на панели управления RabbitMQ. - person Oliver; 20.07.2015
comment
Объявление очереди может быть идемпотентным, но если вы не знаете параметры очереди, в которую пытаетесь опубликовать (автоматическое удаление и т. д.), повторное объявление очереди завершится ошибкой из-за других настроек очереди. - person Dalibor Filus; 08.02.2016
comment
Проверка существования очереди может быть полезной. Например, если вы пишете службу RPC, вы можете убедиться, что клиент RPC не ушел, прежде чем обрабатывать сообщение. - person WGH; 11.02.2016
comment
эта пассивная вещь от @scvalex больше не существует в новых версиях клиента RabbitMQ С#. queue.declare является идемпотентным, если вы передаете одни и те же параметры (например, устойчивый, эксклюзивный и т. д.) - person lawphotog; 20.12.2016
comment
Это будет работать только в том случае, если у пользователя есть права на настройку очереди. Иногда у вас есть разные пользователи для записи и чтения. Так что я не думаю, что это лучшее решение - person Gustavo Andrade Ferreira; 13.10.2017
comment
Вы не можете сказать за всех, что Не утруждайте себя проверкой. Что, если мне нужен один потребитель для одного запроса? Просто нужно проверить. И ваш ответ не отвечает на вопрос. Я объявляю активную очередь и не хочу пассивную, все равно нужно знать, что очередь существует. Что тогда? - person Eugene Zakharenko; 25.02.2019

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

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

person Wertikal    schedule 24.03.2014

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

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

person Dani    schedule 01.01.2015
comment
Ссылки API мертвы, это может быть более обобщенным по теме. - person watery; 19.10.2018
comment
Возможно, это рабочая ссылка: rawcdn .githack.com/rabbitmq/rabbitmq-management/v3.8.3/priv/www/ - person Caius Jard; 25.03.2020
comment
Попросите живого человека войти в консоль и, возможно, позвонить заинтересованному лицу или отправить электронное письмо? Это не серьезное решение. - person Rick O'Shea; 30.07.2021

Поместите код ниже в раздел 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);
    }
person developer_.net    schedule 25.03.2019
comment
На самом деле, это правильный ответ. тот, который был выбран как правильный, создает потенциальный риск объявления и создания заброшенных очередей на сервере RabbitMQ. Метод QueueDeclarePassive был разработан для использования в такой ситуации. - person Majid; 05.03.2020

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

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

person Grwww    schedule 23.08.2017
comment
Я рассматриваю раздельный подход издателей, объявляющих биржи, и потребителей, объявляющих очереди и связывающих их с биржами. Однако, если Exchange не объявлен, когда потребитель пытается связать с ним Queue, возникает исключение. Вы гарантируете, что издатель инициализируется первым, вы также объявляете обмены в потребителе, создаете ли вы вручную обмены в пользовательском интерфейсе/командной строке или делаете что-то еще, чтобы предотвратить проблему? - person brenthompson2; 04.06.2019

В spring-amqp (реализация Java) есть мета API.

@Autowired
public RabbitAdmin rabbitAdmin;

//###############get you queue details##############
Properties properties = rabbitAdmin.getQueueProperties(queueName);

//do your custom logic
if( properties == null)
{
    createQueue(queueName);
}
person lambodar    schedule 09.09.2019