如何检查消息队列是否已存在?
我有2个不同的应用程序,一个创建队列,另一个从该队列读取。
因此,如果我首先运行从队列中读取的客户端,而不是崩溃。 所以为了避免我想首先检查队列是否存在。
这是我如何读取队列的代码片段:
QueueingBasicConsumer <ConsumerName> = new QueueingBasicConsumer(<ChannelName>);
<ChannelName>.BasicConsume("<queuename>", null, <ConsumerName>);
BasicDeliverEventArgs e = (BasicDeliverEventArgs)<ConsumerName>.Queue.Dequeue();
不要打扰检查。
queue.declare是幂等操作。所以,如果你运行一次,两次,N次,结果仍然是相同的。
如果要确保队列存在,只需在使用之前声明它。确保每次都以相同的耐久性,排他性,自动删除的方式声明它,否则你会得到一个例外。
如果您确实需要检查队列是否存在(通常不需要),请执行队列的被动声明。如果队列存在,则该操作成功;如果不存在,则该操作失败。
目前,您可以通过qazxsw poi了解这些信息以及更多信息。
例如,要知道此时是否有一个队列,您可以调用API的GET / api / queues / vhost / name接口。
当有其他人(其他应用程序)负责q声明时,这将不起作用。而我根本无法知道q的所有参数,只是名称。
我宁愿使用passiveDeclare并检查q不存在的IOException
使用QueueDeclare()按照建议执行此操作。此外,我们一直在做的是使队列的使用者成为队列的所有者,并始终发布到由发布者创建和拥有的Exchange。然后,消费者将他们的队列绑定到他们希望从其接收流量的交换机,并为他们想要的流量使用适当的路由密钥过滤器。通过这种方式,对于非持久性队列,发布者不会被消费者静音,并且消费者可以随意使用适当的路由密钥映射的持久或非持久队列。
这导致一个易于管理的系统,并允许使用Web管理创建一个持久的队列并将其绑定到交换机,获取一些流量,解除绑定,然后检查队列内容以了解通过交换的流量和负载。
将下面的代码放在try catch部分中。如果队列或交换不存在则会抛出错误。如果存在它将不会做任何事情。
RabbitMQ Management HTTP API