SpringCloud Stream 整合 RabbitMQ-消費失敗後重試

上一篇完成SpringCloud Stream整合RabbitMQ:
SpringCloud Stream整合RabbitMQ,沒有進行任何配置,本篇記錄一下消息消費失敗後重試配置。
在程序開發過程中難免會出現各種奇葩異常,假如當消費者消費消息時產生異常,生產者收不到ACK確認,消息會被再次嘗試消費,假如是代碼bug則會持續失敗,並持續嘗試,這樣後果你懂的~
因此,本篇簡單介紹一種方式,但只是避免持續重試。

一、屬性-maxAttempts

根據SpringCloud官方文檔上,消費者相關屬性部分可以找到maxAttempts:
在這裏插入圖片描述
可以看到解釋,如果消息消費失敗,此值的配置表示消費重試的次數,並且包括第一次,設置爲1表示不進行重試,默認值3次
接下來實際試驗一下:

二、項目

本次就接着上次的項目繼續使用,項目完整代碼:https://github.com/zrk333/mq-service
只是在上一篇SpringCloud Stream整合RabbitMQ的基礎上進行修改

三、修改消費者

1、修改消費方法

在消息消費方法中寫一個異常: int i = 1 / 0;

CollectionReceiver.java

@Slf4j
@EnableBinding(InputMessageBinding.class)
public class CollectionReceiver {

    @StreamListener(InputMessageBinding.INPUT)
    public void handle(String value){
        log.info("[消息] 接收到發送消息MQ: {}", value);
        int i = 1 / 0;
        CollectionRequest request = JSON.parseObject(value, CollectionRequest.class);
        log.info("處理收集信息:" + request.toString());
    }
}

2、驗證

重啓消費者,並調用生產者接口發送消息,消費者日誌如下:
在這裏插入圖片描述
可以看出打印了三次消費消息日誌跟相關異常,因爲根據官方文檔maxAttempts默認爲3

3、添加配置

spring.cloud.stream.bindings.message-center-input.consumer.maxAttempts=1

4、驗證

重啓消費者,並調用生產者接口發送消息,消費者日誌如下:
在這裏插入圖片描述
可見消費者消費消息日誌只打印了一次,並未進行重試。
這樣雖然避免了多次重試,但如果出現bug,又不想數據丟失,還需要將消息正常消費,其實還有更好的處理方式,下一篇將嘗試加入死信隊列來處理這種情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章