概念
DLX,全称为Dead-Letter-Exchange,可以称之为死信交换器,也有人称之为死信邮箱。当消息在一个队列中变成死信(dead message)之后,它能被重新被发送到另一个交换器中,这个交换器就是 DLX,绑定 DLX 的队列就称之为死信队列。
消息变成死信的时机
- 消息被拒绝(Basic.Reject/Basic.Nack),并且设置requeue参数为false;
- 消息过期;
- 队列达到最大长度。
添加DLX
channel.exchangeDeclare("dlx_exchange","direct"); // 创建 DLX: dlx_exchange
Map<String, Object> args = new HashMap<String , Object>();
args.put ("x-dead-letter-exchange" ,"dlx_exchange");
// 为队列 myqueue 添加 DLX
channel.queueDeclare("myqueue", false, false, false, args);
如果不给这个DLX指定路由键,就使用原队列的路由键。
args.put("x-dead-letter-routing-key" ,"dlx-routing-key");
image.png
在Web界面中D是持久化,DLX是配置了死信队列,DLK是配置配置了x-dead-letter-routing-key属性。
流程
image.png
生产者首先发送一条携带路由键为"rk"的消息,然后经过交换器exchange.normal 顺利地存储到队列queue.normal 中。由于队列queue.normal 设置了过期时间为10s,在这 10s内没有消费者消费这条消息,那么判定这条消息为过期。由于设置了DLX,过期之时,消息被丢给交换器 exchange.dlx 中,这时找到与 exchange.dlx 匹配的队列queue.dlx,最后消息被存储在 queue.dlx 这个死信队列中。