如何识别SQS队列不存在?Spring集成SQS启动未抛队列不存在异常如何处理
为什么启动时没有抛出队列不存在异常
你使用的Spring Cloud AWS 2.2.5.RELEASE版本默认不会在启动阶段校验SQS队列的存在性:
- 监听器初始化阶段仅完成
@SqsListener注解的注册,不会主动调用AWS接口校验队列是否存在,校验动作会延迟到后台线程第一次轮询拉取消息时触发。 - 轮询时检测到队列不存在的异常默认会被判定为可重试异常,框架会后台自动重试拉取,不会向上抛出异常导致应用启动终止。
如何实现队列不存在时阻止应用启动
不需要自行编写@PostConstruct校验逻辑,框架本身已经提供了对应配置项,直接在配置文件中添加如下配置即可:
cloud.aws.sqs.listener.fail-on-missing-queue=true
开启该配置后,应用启动阶段会主动校验所有@SqsListener绑定的队列是否存在,不存在时会直接抛出异常终止启动,完全匹配你的需求。
如果特殊场景下配置不生效,再自行编写启动校验逻辑即可,示例代码如下:
import com.amazonaws.services.sqs.AmazonSQS; import com.amazonaws.services.sqs.model.QueueDoesNotExistException; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.List; @Component public class SqsQueuePreChecker { private final AmazonSQS amazonSQS; // 填入所有需要校验的队列名,也可以通过读取注解元数据批量获取 private final List<String> needCheckQueues = List.of("nonExistingQueue"); public SqsQueuePreChecker(AmazonSQS amazonSQS) { this.amazonSQS = amazonSQS; } @PostConstruct public void checkAllQueuesExist() { for (String queueName : needCheckQueues) { try { amazonSQS.getQueueUrl(queueName); } catch (QueueDoesNotExistException e) { throw new RuntimeException("队列[" + queueName + "]不存在,应用启动失败", e); } } } }
注意:需要确保你配置的AWS凭证拥有
sqs:GetQueueUrl权限,否则校验逻辑会因为权限不足报错。
内容的提问来源于stack exchange,提问作者ald mike
相关产品推荐
相关产品推荐

