@SqsListener无法找到LocalStack SQS队列但AmazonSqsAsync客户端正常求助
LocalStack环境@SqsListener找不到队列解决方案
问题根因
你自定义的AmazonSQSAsync、ResourceIdResolver没有被@SqsListener底层使用的SimpleMessageListenerContainer加载,同时Spring Cloud AWS默认的CloudFormation栈自动检测逻辑会干扰本地SQS客户端的初始化,导致Listener查询队列时走了默认配置,没有指向LocalStack实例。
修复步骤
- 新增yml配置项,关闭CloudFormation栈自动检测
在application-local.yml的cloud.aws节点下添加配置:
stack: auto: false
- 自定义
ResourceIdResolverBean,取消队列名自动拼接账号ID、区域的默认逻辑,直接返回原始队列名
在SqsConfiguration类中添加如下Bean:
@Bean public ResourceIdResolver resourceIdResolver() { // 直接返回队列名,不拼接AWS账号ID、区域前缀 return resourceId -> resourceId; }
- 显式配置
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
相关产品推荐
相关产品推荐

