如何检查消息队列是否已存在?
我有两个不同的应用程序,一个创建队列,另一个从该队列读取。
因此,如果我首先运行从队列中读取的客户端,那么它就会崩溃 所以为了避免我想先检查队列是否存在。
这是我如何阅读队列的代码片段:
QueueingBasicConsumer <ConsumerName> = new QueueingBasicConsumer(<ChannelName>);
<ChannelName>.BasicConsume("<queuename>", null, <ConsumerName>);
BasicDeliverEventArgs e = (BasicDeliverEventArgs)<ConsumerName>.Queue.Dequeue();
答案 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);
}