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=
该错误似乎不言自明,如果我删除队列,当我重新创建它时,我不会收到错误消息,但我的问题是:有没有办法在不删除队列的情况下进行此更改?
不,默认情况下您必须删除队列并重新创建它。
但您可以使用该政策:
rabbitmqctl set_policy DLX "NewQueue" '{"dead-letter-exchange":"my-dlx"}' --apply-to queues
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以添加或删除队列args
而不删除它。
阅读此处了解更多详情。
使用策略配置
要使用策略指定 DLX,请将键“死信交换”添加到策略定义中。类似地,可以通过向策略添加键“死信路由键”来指定显式路由键。
也可以使用管理插件定义策略,有关更多详细信息,请参阅策略文档。