MQ死信和延时消息
MQ死信和延时消息
一、介绍:什么是死信队列?
- 消息被拒(basic.reject or basic.nack)并且没有重新入队(requeue=false);
- 当前队列中的消息数量已经超过最大长度。
- 消息在队列中过期,即当前消息在队列中的存活时间已经超过了预先设置的TTL(Time To Live)时间;
二、配置
- 配置业务队列,绑定到业务交换机上
- 为业务队列配置死信交换机和路由key
- 为死信交换机配置死信队列
生产端:
public static void SendMessage() { var exchangeA = "exchange"; var routeA = "routekey"; var queueA = "queue"; var exchangeD = "dlx.exchange"; var routeD = "dlx.route"; var queueD = "dlx.queue"; using (var connection = RabbitMQHelper.GetConnection()) { using(var channel = connection.CreateModel()) { // 创建死信交换机 channel.ExchangeDeclare(exchangeD, type: "fanout", durable: true, autoDelete: false); // 创建死信队列 channel.QueueDeclare(queueD, durable: true, exclusive: false, autoDelete: false); // 绑定死信交换机和队列 channel.QueueBind(queueD, exchangeD, routeD); channel.ExchangeDeclare(exchangeA, type: "fanout", durable: true, autoDelete: false); channel.QueueDeclare(queueA, durable: true, exclusive: false, autoDelete: false, arguments: new Dictionary<string, object> { { "x-dead-letter-exchange",exchangeD}, //设置当前队列的DLX { "x-dead-letter-routing-key",routeD}, //设置DLX的路由key,DLX会根据该值去找到死信消息存放的队列 { "x-message-ttl",10000} //设置消息的存活时间,即过期时间 }); channel.QueueBind(queueA, exchangeA, routeA); var properties = channel.CreateBasicProperties(); properties.Persistent = true; //发布消息 channel.BasicPublish(exchange: exchangeA, routingKey: routeA, basicProperties: properties, body: Encoding.UTF8.GetBytes("hello rabbitmq message")); } } }
谢谢学习!!!