Подтвердить что ты не робот

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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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);
}