先明白几个概念:
-
死信
消息如何变成死信:
1.消息被拒绝(Basic.Reject/Basic.Nack),并且设置requeue参数为false;
2.消息过期;
3.队列达到最大长度。 -
死信邮箱DLX
当消息在一个队列中变成死信之后,它可以被重新被发送到另一个交换器中,这个交换器就是DLX ,绑定DLX 的队列就称之为死信队列。 -
死信队列:
1.当某个队列(非死信队列)中存在死信时
2.RabbitMQ 就会自动地将这个消息重新发布到设置的DLX上去
3.进而被路由到另一个队列,即死信队列
死信队列的运行图;消息最后会被绑定在死信队列的消费者消费;生产者发送一条消息,然后经过普通交换器存储到消息队列中。没有消费者去消费,导致消息过期。设置了DLX后,消息被丢给死信邮箱中,最后被路由到跟死信邮箱绑定的死信队列中
死信队列的实现:
- 创建一个死信路由器DLX.创建时可以为这个DLX 指定路由键,则死信邮箱内的死信路由键则更改。如果没有特殊指定,则使用原队列的路由键;
- 创建一个死信队列,绑定死信邮箱.
- 在声明消息队列时候方,设置x-dead-letter-exchange 参数,为这个队列添加死信队列
实现:
public class Send {
//队列名
private final static String QUEUE_NAME = "queue";
//死信队列名
private final static String DLX_QUEUE_NAME = "dlx_queue";
//路由器名
private final static String EXCHANGE_NAME = "exchange";
//死信路由器名
private final static String DLX_EXCHANGE_NAME = "dlx_exchange";
//绑定键
private final static String BINDING_KEY = "exchange";
//路由键
private final static String