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

Jig*_*eth 26 .net queue message-queue not-exists rabbitmq

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

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

因此,如果我首先运行从队列中读取的客户端,而不是崩溃.
所以为了避免我想首先检查队列是否存在.

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

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

scv*_*lex 57

不要打扰检查.

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

如果要确保队列存在,只需在使用之前声明它.确保每次都以相同的耐久性,排他性,自动删除的方式声明它,否则你会得到一个例外.

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

  • 队列声明可能是幂等的,但如果您不知道要尝试发布到的队列的参数(自动删除等),由于队列设置不同,队列重新声明将失败. (7认同)
  • 使用IModel.QueueDeclare并将passive设置为true.http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.8.1/rabbitmq-dotnet-client-1.8.1-client-htmldoc/html/type-RabbitMQ.Client.IModel.html (4认同)
  • 只有当用户具有队列的配置权限时,这才有效。有时,您有不同的用户进行写作和阅读。所以我不认为这是最好的解决方案 (4认同)
  • 检查队列是否存在可能很有用。例如,如果您正在编写 RPC 服务,您可能需要确保 RPC 客户端在处理消息之前没有消失。 (3认同)
  • 能否请您提及在 c# api 中被动声明队列的语法 (2认同)
  • 你不能告诉每个人“不要费心检查”。如果我想要单个消费者进行单个查询怎么办?只需要检查一下。而你的回答并没有回答这个问题。我有一个主动队列声明,不想被动,仍然需要知道队列存在。那是什么? (2认同)

小智 11

将以下代码放入 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);
    }
Run Code Online (Sandbox Code Playgroud)

  • 事实上,这是正确的答案。被选择为正确的队列会带来在 RabbitMQ 服务器中声明和创建废弃队列的潜在风险。QueueDeclarePassive 方法被设计用于这种情况。 (3认同)

小智 5

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

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


Dan*_*ani 5

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

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