更改RabbitMQ队列中的参数

4

我有一个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 中

其他信息:AMQP操作被中断:由对等方启动的AMQP关闭原因,代码=406,文本="PRECONDITION_FAILED-队列'NewQueue'的'in-equivalent arg'x-dead-letter-exchange'在虚拟主机'/'中接收了类型为'longstr'的值'dl.exchange'但当前没有", classId=50, methodId=10, cause=

错误看起来很清楚易懂,如果我删除队列,重新创建它,就不会出现这个错误,但我的问题是:是否有一种方法可以在不删除队列的情况下进行更改?
1个回答

7

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

但是您可以使用策略:

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

通过这种方式,您可以添加或删除队列args而无需将其删除。

在此处阅读更多详细信息。

使用策略进行配置

要使用策略指定DLX,请将键“dead-letter-exchange”添加到策略定义中。 同样,可以通过添加键“dead-letter-routing-key”来指定显式路由键。

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


由于某种原因,这对我不起作用。该消息未路由,只有通过"x-dead-letter-exchange"才有效。 - TigerBear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接