为何Spring Boot中使用@SqsListener消费Amazon SQS消息后会自动删除?
@SqsListener消费后消息自动删除的原因
你此前对SQS原生机制的认知是完全正确的,消息自动删除不是SQS本身的原生行为,是Spring Cloud AWS框架对@SqsListener的封装逻辑。
- SQS原生规则:消息会在你配置的留存周期内永久保留,直到到期自动删除;消费过程仅通过可见性超时规则锁定正在被处理的消息,消费者必须主动调用DeleteMessage API才能在留存周期到期前提前删除消息。
- Spring Cloud AWS默认封装逻辑:
@SqsListener的默认删除策略为ON_SUCCESS,只要被注解修饰的消费方法正常执行完成、没有抛出未捕获的异常,框架就会自动在后台调用SQS的DeleteMessage接口,删除这条已消费成功的消息。
你给出的示例代码使用的是@SqsListener的默认配置,因此方法正常执行完成后消息就会被自动删除:
@SqsListener("javatechie-queue") public void loadMessageFromSQS(String message) { logger.info("message from SQS Queue {}",message); }
补充说明:如果消费方法执行过程中抛出未捕获的异常,框架不会触发自动删除操作,消息会在可见性超时结束后重新回到队列,可被其他消费者消费,和SQS原生机制保持一致。
如果你需要手动控制消息的删除时机,可以修改注解的删除策略配置:// 关闭自动删除,手动控制删除时机 @SqsListener(value = "javatechie-queue", deletionPolicy = SqsMessageDeletionPolicy.NEVER) public void loadMessageFromSQS(String message, Acknowledgment acknowledgment) { logger.info("message from SQS Queue {}",message); // 业务逻辑处理完成后手动调用确认删除 acknowledgment.acknowledge(); }
内容的提问来源于stack exchange,提问作者Shambhavi Rai
相关产品推荐
相关产品推荐

