38

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

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

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

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

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

6 回答 6

74

不要费心检查。

queue.declare是幂等操作。所以,如果你运行一次,两次,N次,结果还是一样的。

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

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

于 2010-08-11T10:53:00.170 回答
6

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

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

于 2014-03-24T09:12:47.317 回答
6

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

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

于 2015-01-01T18:24:30.220 回答
4

将下面的代码放在 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);
    }
于 2019-03-25T13:17:17.180 回答
1

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

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

于 2017-08-23T15:41:50.600 回答
1

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);
}
于 2019-09-09T10:51:29.440 回答