Spring Boot中AWS SQS如何配置DLQ死信队列及重试阈值规则
AWS SQS 现有队列配置DLQ(死信队列)完整步骤
前置准备:完成AWS侧队列属性配置
DLQ 消息转发是 SQS 服务端原生能力,无需自行编写迁移逻辑,首先需要在 AWS 控制台/CLI 完成队列关联配置:
- 先创建和源队列类型一致的 DLQ:标准源队列对应标准 DLQ,FIFO 源队列对应 FIFO DLQ,两者必须在同一 AWS 区域、同一账号下
- 为源队列配置重驱动策略(Redrive Policy),指定两个核心参数:
- 目标 DLQ 的 ARN 地址
- 最大接收次数:即你需要的重试阈值,消息被消费者接收但未成功删除的次数达到该值后,SQS 会自动将消息转移到绑定的 DLQ
调整Spring侧@SQSListener适配配置
结合你当前的配置类,只需做少量调整即可配合SQS的重驱动策略生效:
1. 调整监听容器工厂配置
修改messageListenerContainer方法的工厂配置,确保处理失败的消息不会被框架误删,触发SQS重新投递:
@Bean public SimpleMessageListenerContainer messageListenerContainer(AmazonSQSAsync amazonSQSAsync) { SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory(); factory.setAmazonSqs(amazonSQSAsync); factory.setMaxNumberOfMessages(10); // 新增配置:禁用框架默认的本地重试,直接交给SQS服务端策略处理,如需本地重试可看下方可选配置 factory.setBackOffTime(0); // 新增配置:消息可见性超时,按单条消息最大处理时长调整,单位为毫秒 factory.setVisibilityTimeout(30000); SimpleMessageListenerContainer simpleMessageListenerContainer = factory.createSimpleMessageListenerContainer(); simpleMessageListenerContainer.setQueueStopTimeout(queueStopTimeout*1000); simpleMessageListenerContainer.setMessageHandler(messageHandler(amazonSQSAsync)); return simpleMessageListenerContainer; }
2. 业务逻辑适配要求
@SQSListener标注的监听器方法,处理失败时不要自行捕获异常吞掉,必须主动抛出非受查异常,框架接收到异常后不会调用消息删除接口,消息会在可见性超时后被SQS回收重新投递,接收次数累加。
可选:配置本地重试规则
如果希望先在业务节点本地重试多次,再触发SQS服务端重试,可以给消息处理器注入重试模板:
@Bean public QueueMessageHandler messageHandler(AmazonSQSAsync amazonSQSAsync) { QueueMessageHandlerFactory queueMessageHandlerFactory = new QueueMessageHandlerFactory(); queueMessageHandlerFactory.setAmazonSqs(amazonSQSAsync); // 配置本地重试规则 RetryTemplate retryTemplate = new RetryTemplate(); SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); retryPolicy.setMaxAttempts(2); // 本地重试2次,加上首次调用总共3次本地处理 FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); backOffPolicy.setBackOffPeriod(1000); // 每次重试间隔1秒 retryTemplate.setRetryPolicy(retryPolicy); retryTemplate.setBackOffPolicy(backOffPolicy); queueMessageHandlerFactory.setRetryTemplate(retryTemplate); QueueMessageHandler messageHandler = queueMessageHandlerFactory.createQueueMessageHandler(); return messageHandler; }
该场景下SQS侧配置的最大接收次数,为本地重试全部失败后的服务端重试次数,可根据实际业务需求调整阈值。
注意事项
- DLQ的消息保留时长可单独配置,最长支持14天
- 不要在监听器方法内手动调用消息删除接口,否则会直接清空消息接收计数,无法触发重驱动逻辑
内容的提问来源于stack exchange,提问作者Aditya K
相关产品推荐
相关产品推荐

