Spring Cloud AWS 2.3.2中@SqsListener注解方法无法消费SQS消息如何解决
问题排查与修复清单
按优先级依次排查修改:
启用SQS监听注解
Spring Cloud AWS 2.3.x版本必须在启动类或SqsMessagingConfig配置类上添加@EnableSqs注解,否则Spring不会扫描注册@SqsListener修饰的方法,自然不会触发消费动作。修正监听方法权限
当前receiveMessage方法为private私有方法,Spring无法代理调用,需将方法修饰符改为public。修正监听方法语法与参数配置
你的方法签名存在明显语法错误:private void receiveMessage(List<Schedule> schedules) String partnerId)缺少参数分隔逗号、括号不匹配;额外的partnerId参数未指定参数来源,Spring无法解析会直接抛出异常终止消费。不需要该参数可直接删除,需要获取队列头属性需搭配@Header注解,修正后的示例签名:@SqsListener(value = "SCHEDULES", deletionPolicy = SqsMessageDeletionPolicy.NO_REDRIVE) public void receiveMessage(@Payload List<Schedule> schedules) { // 原有业务逻辑 }补充批量消费配置
你设置了factory.setMaxNumberOfMessages(10)批量拉取消息,但未开启批量消费开关,需在SimpleMessageListenerContainerFactory配置中新增:factory.setBatchListener(true);另外泛型
List<Schedule>反序列化存在类型擦除问题,可搭配@Payload注解标识,或改为Schedule[]数组接收避免类型解析失败。修正参数解析器配置逻辑
配置QueueMessageHandlerFactory时你调用了setArgumentResolvers方法,会直接覆盖Spring默认注册的所有参数解析器(包括@Header、系统消息属性相关的解析器),如果仅需添加自定义Payload解析器,改为调用addArgumentResolvers方法即可。权限与基础配置校验
确认你使用的AWS密钥具备sqs:ReceiveMessage、sqs:DeleteMessage、sqs:GetQueueUrl权限,队列名SCHEDULES和配置的区域us-east-2与实际AWS资源完全匹配。
内容的提问来源于stack exchange,提问作者CjRobin

