上一篇完成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,又不想數據丟失,還需要將消息正常消費,其實還有更好的處理方式,下一篇將嘗試加入死信隊列來處理這種情況。