如何检查消息队列是否已存在?
我有两个不同的应用程序,一个创建队列,另一个从该队列中读取。
因此,如果我运行客户端,首先从队列中读取,那么它会崩溃。
所以为了避免这种情况,我想先检查一下队列是否存在。
下面是我如何读取队列的代码片段:
QueueingBasicConsumer <ConsumerName> = new QueueingBasicConsumer(<ChannelName>);
<ChannelName>.BasicConsume("<queuename>", null, <ConsumerName>);
BasicDeliverEventArgs e = (BasicDeliverEventArgs)<ConsumerName>.Queue.Dequeue();
7条答案
按热度按时间83qze16e1#
不用查了。
是一个幂等运算。所以,如果你运行它一次,两次,N次,结果仍然是一样的。
如果你想确保队列的存在性,只需在使用它之前声明它,确保你每次都用相同的持久性、独占性、自动删除性来声明它,否则你会得到一个异常。
如果你真的需要检查一个队列是否存在(通常你不需要),那么对队列做一个被动声明。如果队列存在,那么这个操作就成功,如果不存在,那么这个操作就失败。
5gfr0r5j2#
当有其他人(其他应用程序)负责q声明时,这就不起作用了,而且我根本不可能知道q的所有参数,只知道名字。
我宁愿使用passiveDeclare并检查q不存在的IOException
vsdwdz233#
目前,您可以通过RabbitMQ Management HTTP API了解这些信息和更多信息。
例如,要知道此时是否有一个队列处于运行状态,可以调用API的GET**/api/queues/vhost/name**接口。
0ejtzxu14#
将以下代码放在try catch节中如果队列或交换不存在,则将引发错误如果存在,则不会执行任何操作
6ss1mwsb5#
spring-amqp中有一个meta api(Java实现)
kgsdhlau6#
使用队列声明()来执行此操作。此外,我们一直做的是使队列的使用者成为队列的所有者,并始终将队列发布到由发布者创建和拥有的交换机。然后,使用者将其队列绑定到他们希望从其接收通信量的交换机,并对他们希望的通信量使用适当的路由关键字过滤器。这样,对于非持久队列,发布者不被任何消费者静音,并且消费者可以自由地进出与适当路由关键字Map的持久或非持久队列。
这使得系统易于管理,并允许使用Web管理来创建持久队列并将其绑定到交换,获取一些流量,解除绑定,然后检查队列内容以了解通过交换的流量和负载。
3zwjbxry7#
依我的拙见,最好的方法是覆盖rabbitmq的默认配置。
主类应该禁用默认的rabbit配置:
我的rabbitmq属性在rabbitmq.properties文件中:
然后就创建自己配置的rabbitmq组件:
还应设置消费者:
现在,当客户端启动时,如果队列不存在,它将自动创建队列如果队列存在,它将不执行任何操作