修改RabbitMQ队列中的参数

本文关键字:参数 队列 RabbitMQ 修改 | 更新日期: 2023-09-27 18:14:07

我有一个RabbitMQ队列,最初是这样声明的:

var result = _channel.QueueDeclare("NewQueue", true, false, false, null);

我正在尝试添加死信交换,所以我将代码更改为:

_channel.ExchangeDeclare("dl.exchange", "direct");
Dictionary<string, object> args = new Dictionary<string, object>()
{
    { "x-dead-letter-exchange", "dl.exchange" }
};            
var result = _channel.QueueDeclare("NewQueue", true, false, false, args);

当我运行这个,我得到错误:

异常:"RabbitMQ.Client.Exceptions。OperationInterruptedException"RabbitMQ.Client.dll

附加信息:The AMQP operation was interrupted: AMQPclose-reason,由Peer发起,code=406, text="PRECONDITION_FAILED - .queue 'NewQueue'的等价arg 'x死信交换'Vhost '/':收到值'dl '。交换'类型'longstr',但, classId=50, methodId=10, cause=

错误似乎不言自明,如果我删除队列,当我重新创建它时,我没有得到错误,但我的问题是:有没有一种方法可以在不删除队列的情况下进行此更改?

修改RabbitMQ队列中的参数

不能,默认情况下必须删除队列并重新创建。

但是你可以使用策略:

rabbitmqctl set_policy DLX "NewQueue" '{"dead-letter-exchange":"my-dlx"}' --apply-to queues

这样可以添加或删除队列args而不删除它。

阅读这里了解更多细节。

使用策略的配置

要指定DLX使用策略,将密钥"dead-letter-exchange"添加到策略定义。类似地,可以通过添加键来指定显式路由键"dead-letter-routing-key"到策略。

策略也可以使用管理插件定义,参见有关更多细节的策略文档。