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,又不想数据丢失,还需要将消息正常消费,其实还有更好的处理方式,下一篇将尝试加入死信队列来处理这种情况。

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