如何检查RabbitMQ消息队列是否存在?

时间:2010-08-11 10:15:21

标签: .net queue rabbitmq message-queue not-exists

如何检查消息队列是否已存在?

我有两个不同的应用程序,一个创建队列,另一个从该队列读取。

因此,如果我首先运行从队列中读取的客户端,那么它就会崩溃 所以为了避免我想先检查队列是否存在。

这是我如何阅读队列的代码片段:

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

6 个答案:

答案 0 :(得分:50)

不要打扰检查。

queue.declare 是一种幂等操作。所以,如果你运行一次,两次,N次,结果仍然是相同的。

如果要确保队列存在,只需在使用之前声明它。确保每次都声明它具有相同的耐久性,排他性,自动删除性,否则你将获得例外。

如果您确实需要检查是否存在队列(通常不需要),请执行队列的被动声明。如果队列存在,则该操作成功;如果不存在,则该操作失败。

答案 1 :(得分:4)

目前,您可以通过RabbitMQ Management HTTP API了解这些信息以及更多内容。

例如,要知道此时是否有一个队列,您可以调用API的GET / api / queues / vhost / name 接口。

答案 2 :(得分:2)

当有其他人(其他应用程序)负责q声明时,这将不起作用。而我根本无法知道q的所有参数,只是名称。

我宁愿使用passiveDeclare并检查q不存在的IOException

答案 3 :(得分:0)

使用QueueDeclare()按照建议执行此操作。此外,我们一直在做的是使队列的使用者成为队列的所有者,并始终发布到由发布者创建和拥有的Exchange。然后,消费者将他们的队列绑定到他们希望从其接收流量的交换机,并为他们想要的流量使用适当的路由密钥过滤器。通过这种方式,对于非持久性队列,发布者不会被消费者静音,消费者可以随意使用适当的路由密钥映射的持久或非持久队列。

这导致一个易于管理的系统,并允许使用Web管理创建一个持久队列并将其绑定到交换机,获取一些流量,解除绑定,然后检查队列内容以了解将要发生的流量和负载通过交流。

答案 4 :(得分:0)

将以下代码放在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);
    }

答案 5 :(得分:0)

spring-amqp(java实现)中有一个meta api

@Autowired
public RabbitAdmin rabbitAdmin;

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

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