前两篇介绍了SpringCloud Stream整合RabbitMQ、消费失败后重试maxAttempts属性:
-
SpringCloud Stream 整合RabbitMQ
-
SpringCloud Stream 整合 RabbitMQ-消费失败后重试
上篇提到,如果消费者出现代码bug,又没有做额外的拯救措施,又希望消息不丢失且正常消费,这篇将介绍使用死信队列(DLQ队列)进行处理,使代码修复完成后,消息可以正常被消费。
一、属性-autoBindDlq
根据SpringCloud官方文档上,RabbitMQ消费者相关属性部分可以找到autoBindDlq:
可以看到其默认值为false。
接下来实际试验一下:
二、项目
本次就接着上次的项目继续使用,项目完整代码:
https://github.com/zrk333/mq-service
只是在上一篇
SpringCloud Stream 整合 RabbitMQ-消费失败后重试
的基础上进行修改,并沿用消费者消费方法中的异常int i = 1 / 0;
三、修改消费者
1、添加配置
spring.cloud.stream.rabbit.bindings.message-center-input.consumer.autoBindDlq=true
另外分组之前添加过,没有添加的需要添加一下,为了添加dlq队列时更好的分组,下面有截图可以看到
spring.cloud.stream.bindings.message-center-input.group=${spring.application.name}
2、验证
重启消费者,并调用生产者接口发送消息
依然抛出异常,现在看一下RabbitMQ网页页面:
可以发现多了一个dlp队列,并且Ready Messages 的值为1,多尝试几次还会增加:
3、查看dlq队列
点击页面队列名
message-center.mq-service-consumer.dlq
进入:
Get messages 部分可以查看当前在dlq队列中存放的消息,可以输入数量(相当于查看几条),点击按钮:
可以看到消息原封不动保存,现在将代码修复好,并手动尝试重新消费:
4、解决bug并重新验证
注释掉抛异常的代码,重启消费者,页面向下看到Move messages部分:
可以再输入框中填入目标队列名称(可以从
Get messages
部分的
Routing Key
进行
复制
),点击按钮,查看页面
消费者日志:
可以看到消费被重新放回
message-center.mq-service-consumer
队列,并重新消费。
四、补充-插件
假如未装插件,页面如下,此时没有Move Messages按钮
按提示需要执行下面命令开启插件,
不需要重启rabbitmq
rabbitmq-plugins enable rabbitmq_shovel rabbitmq_shovel_management
- 查看插件命令
rabbitmq-plugins list
- 启动插件命令
rabbitmq-plugins enable xxx
- 关闭插件命令
rabbitmq-plugins disable xxx
五、参考链接