前兩篇介紹了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