RabbitMQ:如何防止QueueDeclare自动生成新Queue

Posted

技术标签:

【中文标题】RabbitMQ:如何防止QueueDeclare自动生成新Queue【英文标题】:RabbitMQ: How to prevent QueueDeclare to automatically generate a new Queue 【发布时间】:2015-04-12 14:08:39 【问题描述】:

使用 RabbitMQ,我正在做类似的事情:

channel.QueueDeclare(QueueName, true, false, false, null);

默认情况下,如果现有队列中没有一个与提供的名称匹配,RabbitMQ 会创建一个新队列。我想抛出一个异常。 这可能吗?

谢谢

【问题讨论】:

你想实现什么?您是否尝试过使用被动声明? 我只想使用队列而不声明它是否丢失。我将调查被动声明。谢谢 如果队列丢失了,那么你必须声明它,没有办法绕过它。 【参考方案1】:

您可以绑定到现有队列而无需声明新队列。

try

    channel.QueueBind(queueName, exchange, routingKey);

catch (RabbitMQ.Client.Exceptions.OperationInterruptedException ex)

    // Queue not found

如果您尝试绑定的队列不存在则抛出异常的示例:

RabbitMQ.Client.Exceptions.OperationInterruptedException:AMQP 操作被中断:AMQP 关闭原因,由 Peer 发起,code=404,text="NOT_FOUND - no queue 'TestQueue' in vhost '/'",classId=50 , methodId=20, cause=

【讨论】:

【参考方案2】:

为此进行了被动声明。使用IModel.QueueDeclarePassive():

model.QueueDeclarePassive("queue-name");

如果队列已经存在,则不执行任何操作,否则引发异常。

【讨论】:

以上是关于RabbitMQ:如何防止QueueDeclare自动生成新Queue的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ入门教程:队列声明queueDeclare

RabbitMQ的各个参数

rabbitmq 消息的状态转换

更改 RabbitMQ 队列中的参数

RabbitMQ 队列的参数详解

rabbitMQ的进阶使用