我有一个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);
当我运行时,我收到错误:
抛出异常: &#39; RabbitMQ.Client.Exceptions.OperationInterruptedException&#39;在 RabbitMQ.Client.dll
附加信息:AMQP操作被中断:AMQP close-reason,由Peer发起,代码= 406,text =&#34; PRECONDITION_FAILED - 不等价的arg&#39; x-dead-letter-exchange&#39;排队&#39; NewQueue&#39;在 vhost&#39; /&#39;:收到了价值&#39; dl.exchange&#39;类型&#39; longstr&#39;但 current is none&#34;,classId = 50,methodId = 10,cause =
错误看起来非常自我解释,如果我删除队列,当我重新创建它时,我不会得到错误,但我的问题是:有没有办法在不删除错误的情况下进行此更改队列?
答案 0 :(得分:0)
不,默认情况下,您必须删除队列并重新创建它。
但您可以使用该政策:
rabbitmqctl set_policy DLX "NewQueue" '{"dead-letter-exchange":"my-dlx"}' --apply-to queues
通过这种方式,您可以添加或删除队列args
而不删除它。
Read here了解更多细节。
使用政策配置
要使用策略指定DLX,请添加密钥&#34; dead-letter-exchange&#34;到了 政策定义。 类似地,可以通过添加密钥来指定显式路由密钥 &#34;死信路由键&#34;政策。
也可以使用管理插件定义策略,请参阅 政策文件了解更多详情。