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

@SqsListener无法找到LocalStack SQS队列但AmazonSqsAsync客户端正常求助

LocalStack环境@SqsListener找不到队列解决方案

问题根因

你自定义的AmazonSQSAsync、ResourceIdResolver没有被@SqsListener底层使用的SimpleMessageListenerContainer加载,同时Spring Cloud AWS默认的CloudFormation栈自动检测逻辑会干扰本地SQS客户端的初始化,导致Listener查询队列时走了默认配置,没有指向LocalStack实例。

修复步骤

  1. 新增yml配置项,关闭CloudFormation栈自动检测
    在application-local.yml的cloud.aws节点下添加配置:
stack:
  auto: false
  1. 自定义ResourceIdResolver Bean,取消队列名自动拼接账号ID、区域的默认逻辑,直接返回原始队列名
    在SqsConfiguration类中添加如下Bean:
@Bean
public ResourceIdResolver resourceIdResolver() {
    // 直接返回队列名,不拼接AWS账号ID、区域前缀
    return resourceId -> resourceId;
}
  1. 显式配置SimpleMessageListenerContainerFactory,指定使用你自定义的AmazonSQSAsync和ResourceIdResolver
    在SqsConfiguration类中添加如下Bean:
@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(
        AmazonSQSAsync amazonSQSAsync,
        ResourceIdResolver resourceIdResolver) {
    SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory();
    // 绑定自定义的SQS客户端
    factory.setAmazonSqs(amazonSQSAsync);
    // 绑定自定义的资源ID解析器
    factory.setResourceIdResolver(resourceIdResolver);
    // 本地开发可选配置:长轮询等待时间,减少空轮询开销
    factory.setWaitTimeOut(20);
    return factory;
}

验证方法

重启应用后如果不再抛出QueueDoesNotExistException即为修复成功,也可以直接给@SqsListener传入完整队列URLhttp://localhost:4566/queue/test-availability-queue做快速验证,如果此时Listener可以正常启动则说明是资源ID解析逻辑的问题。

内容的提问来源于stack exchange,提问作者Glenn KIM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:36:02