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