使用@SqsListener未显式指定确认模式的三类技术疑问
@SqsListener 相关疑问解答
问题1:未显式指定确认模式时的默认行为
是的,未指定确认模式时,默认采用AUTO_ACKNOWLEDGE模式。只要监听方法正常执行完成(无异常抛出),消息会自动被确认并从SQS队列中删除;若方法执行抛出异常,消息不会被确认,会按SQS重试策略回到队列。
问题2:deletePolicy=ON_SUCCEEDED与确认模式的关系
deletePolicy=ON_SUCCEEDED不属于标准JMS确认模式,它是Spring Cloud AWS提供的上层配置项,但功能和AUTO_ACKNOWLEDGE高度相似——都是在监听方法成功执行后触发消息删除。
两者不会产生冲突,因为deletePolicy本质是对底层确认模式的封装映射:设置deletePolicy=ON_SUCCEEDED时,底层会对应使用AUTO_ACKNOWLEDGE逻辑;若设置deletePolicy=NEVER,则对应手动确认模式,需开发者主动触发确认操作。
问题3:显式指定确认模式的示例
在@SqsListener注解中,通过acknowledgmentMode属性可显式指定确认模式,以下是常见场景示例:
示例1:显式指定自动确认模式
@SqsListener(value = "${my-queue}", acknowledgmentMode = AcknowledgmentMode.AUTO) public void listenToMyQueue(MyEvent event) { // 业务逻辑处理 }
示例2:显式指定手动确认模式
需手动控制确认时机时,指定AcknowledgmentMode.MANUAL并注入Acknowledgment对象:
@SqsListener(value = "${my-queue}", acknowledgmentMode = AcknowledgmentMode.MANUAL) public void listenToMyQueue(MyEvent event, Acknowledgment acknowledgment) { try { // 业务逻辑处理 // 手动确认消息,触发队列删除 acknowledgment.acknowledge(); } catch (Exception e) { // 异常场景下不确认,消息重回队列 } }
内容的提问来源于stack exchange,提问作者Laodao
相关产品推荐
相关产品推荐

