DLX,Deal-Letter-Exchange,死信交换器。当一个小小在队列中变成死信(DeadMessage)之后,他能被重新发送到DLX中,与DLX绑定到队列就是死信队列。
消息变成死信队列的情况:
1.消息被拒绝,并且设置ReQueue参数false;
2.消息过期;
3.队列打到最大长度;
生产者发送一条消息,经过交换器exchange_normal顺利存储到队列queue_normal中;由队列queue_normal设置为10s过期,在10s内没有消费者消费消息,那么判定消息过期;设置了DLX,过期消息被丢给交换器exchange_dlx,然后被存储在死信队列queue_dlx中。
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = IP_ADDRESS;
factory.Port = PORT;
factory.UserName = USER_NAME;
factory.Password = PASSWORD;
con = factory.CreateConnection();
channel = con.CreateModel();
//DLX
channel.ExchangeDeclare("exchange_dlx", "direct", true, false, null);
//普通交换器
channel.ExchangeDeclare("exchange_normal", "fanout", true, false, null);
//参数设置
Dictionary<string, object> args = new Dictionary<string, object>();
args.Add("x-message-ttl", 10000);//TTL
args.Add("x-dead-letter-exchange", "exchange_dlx");//DLX
args.Add("x-dead-letter-routing-key", "routingkey");//routingKey
//普通队列绑定
channel.QueueDeclare("queue_normal", true, false, false, args);
channel.QueueBind("queue_normal", "exchange_normal", null);
//死信队列绑定
channel.QueueDeclare("queue_dlx", true, false, false, args);
channel.QueueBind("queue_dlx", "exchange_dlx", "routingkey", null);
string message = "Hello Word!";
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
channel.BasicPublish("exchange_normal","", properties, body);
延迟队列
上面对栗子就是一个延迟队列,消费者监听的并不是队列queue_normal,而是监听的queue_dlx,生产者发送消息之后,10s之后消费者从队列queue_dlx中获取队列并消费,队列queue_dlx也称为延迟队列
更多精彩请关注公众号:隔壁王小猿(gbwxy-happy)