更改 RabbitMQ 队列中的参数

Pau*_*els 2 c# message-queue rabbitmq

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

var result = _channel.QueueDeclare("NewQueue", true, false, false, null);
Run Code Online (Sandbox Code Playgroud)

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

_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);
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我收到错误:

抛出异常:RabbitMQ.Client.dll 中的“RabbitMQ.Client.Exceptions.OperationInterruptedException”

附加信息:AMQP 操作被中断:AMQP close-reason,由 Peer 发起,code=406,text="PRECONDITION_FAILED - inequivalent arg 'x-dead-letter-exchange' for queue 'NewQueue' in vhost'/': received 'longstr' 类型的值 'dl.exchange' 但当前为 none", classId=50, methodId=10, cause=

该错误似乎不言自明,如果我删除队列,当我重新创建它时,我不会收到错误消息,但我的问题是:有没有办法在不删除队列的情况下进行此更改?

Gab*_*ele 5

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

但您可以使用该政策:

rabbitmqctl set_policy DLX "NewQueue" '{"dead-letter-exchange":"my-dlx"}' --apply-to queues
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以添加或删除队列args而不删除它。

阅读此处了解更多详情。

使用策略配置

要使用策略指定 DLX,请将键“死信交换”添加到策略定义中。类似地,可以通过向策略添加键“死信路由键”来指定显式路由键。

也可以使用管理插件定义策略,有关更多详细信息,请参阅策略文档。