我有一个最初声明如下的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‘in RabbitMQ.Client.dll 附加信息: AMQP操作被中断: AMQP关闭原因,由Peer、code=406、text="PRECONDITION_FAILED -不等效arg‘x死信-exchange’为vhost中的队列'NewQueue‘/:接收'longstr’但当前是空的'dl.exchange‘的值,classId=50,methodId=10,cause=。
这个错误似乎是不言自明的,如果我删除队列,当我重新创建它时,我不会得到错误,但是我的问题是:是否有一种方法可以在不删除队列的情况下进行此更改?
发布于 2016-10-20 07:12:44
不,默认情况下,您必须删除队列并重新创建它。
但您可以使用以下策略:
rabbitmqctl set_policy DLX "NewQueue" '{"dead-letter-exchange":"my-dlx"}' --apply-to queues通过这种方式,您可以添加或删除队列args而不删除它。
有关更多细节,请参见在这里读。
配置使用策略 若要使用策略指定DLX,请将键“死信交换”添加到策略定义中。同样,可以通过在策略中添加“死信路由-密钥”来指定显式路由密钥。 还可以使用管理插件定义策略,有关详细信息,请参阅策略文档。
https://stackoverflow.com/questions/40146740
复制相似问题