这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战
1.业务背景
如果有有错误消息,如果手动nack同时将消息放回到队列中,那么这条消息会反复消费,留在队列中 。
如果nack后将消息丢弃,那么如果碰到网络抖动,消息也会丢失 。所以 通过建立死信队列避免消息丢失。
2.实现
文件目录如下:
1.原理
我们额外建立一条队列。当消息进入进入业务队列后,如果收到nack那么就将这条消息放入这条条队列中 。
2.修改pom文件
1 | js复制代码 <dependency> |
3.修改配置文件
1 | js复制代码server: |
4.rabbitmq的配置
1 | js复制代码@Configuration |
5.util类
发送是否成功的回调方法。
1 | js复制代码public class MsgSendConfirmCallBack implements RabbitTemplate.ConfirmCallback { |
这里有一个点,如果想做实现消息失败重新发送,在注释处可以实现。需要将消息写入本地,如果失败从本地读取,然后发送,如果成功删除本地信息。
6.业务队列(如:订单业务)
这里声明了一个业务队列 ,关键点在于x-dead-letter-exchange,x-dead-letter-routing-key 两个参数。
1 | js复制代码@Configuration |
这里有一个点如果想持久化消息到磁盘,需要新建队列时,new Queue将第二个参数输入为true,但是面对大并发时效率会变低 。
7.死信队列
这里声明死信队列与绑定关系。
1 | js复制代码@Configuration |
8.生产者消费者
生产者与消费者的代码实现。
1 | js复制代码public enum RabbitEnum { |
9.实验
当发送yewu1_demo_dead_queue队列时,如果抛出异常,会放入死信队列中。
本文转载自: 掘金