在參考 Dead-Letter-Exchange 進行Dead-letter-exchange的理解,
在本地時,想要創建 Dead-letter-exchange
時,一直報錯,錯誤如下:
Unhandled Exception: RabbitMQ.Client.Exceptions.OperationInterruptedException: The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=406, text="PRECONDITION_FAILED - inequivalent arg 'x-dead-letter-exchange' for queue 'q_test' in vhost '/': received the value 'q-dead-letter-exchange' of type 'longstr' but current is none", classId=50, methodId=10, cause=
at RabbitMQ.Client.Impl.SimpleBlockingRpcContinuation.GetReply(TimeSpan timeout)
at RabbitMQ.Client.Impl.ModelBase.QueueDeclare(String queue, Boolean passive, Boolean durable, Boolean exclusive, Boolean autoDelete, IDictionary`2 arguments)
at RabbitMQ.Client.Impl.AutorecoveringModel.QueueDeclare(String queue, Boolean durable, Boolean exclusive, Boolean autoDelete, IDictionary`2 arguments)
at CNBlogs.Question.EventBusRabbitMQ.EventBusRabbitMQ.CreateConsumerChannel()
去官網查了查,姿勢也正確,先聲明一個Exchange
channel.ExchangeDeclare("q-dead-letter-exchange", type: "direct");
然后再指定 x-dead-letter-exchange
參數
var args = new Dictionary<string, object>()
{
{"x-dead-letter-exchange", "q-dead-letter-exchange"}
};
最后放到隊列聲明里面:
channel.QueueDeclare(queue: _queueName,
durable: true,
exclusive: false,
autoDelete: false,
arguments: args);
然而,每次一運行就報上面那個錯誤,最后子啊Github上找到了答案
原因可能是我原來的隊列中,因為有尚未確認的消息在。然后,把RabbitMQ 中的Queue 和Exchange 刪除,重新運行程序就成功了。下面是Queue和Exchange 的截圖