更改RabbitMQ队列中的参数

时间:2016-10-20 06:14:15

标签: c# rabbitmq message-queue

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

错误看起来非常自我解释,如果我删除队列,当我重新创建它时,我不会得到错误,但我的问题是:有没有办法在不删除错误的情况下进行此更改队列?

1 个答案:

答案 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;政策。

     

也可以使用管理插件定义策略,请参阅   政策文件了解更多详情。