You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:45:08