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

SQS监听器无法接收消息问题排查求助

SQS监听器无法接收消息的排查与解决

结合你提供的配置信息,以下是具体的排查点和解决方案:

1. 核心问题:版本兼容性冲突

Spring Boot 3.0.4基于Spring 6生态,但你使用的spring-cloud-starter-aws-messaging:2.2.6.RELEASE是Spring Cloud Hoxton版本,仅支持Spring Boot 2.x,二者存在严重的版本不兼容,这是监听器无法工作的主要原因。

解决步骤:

替换为支持Spring Boot 3的AWSpring依赖(原Spring Cloud AWS已迁移至AWSpring组织):

<dependency>
    <groupId>io.awspring.cloud</groupId>
    <artifactId>spring-cloud-starter-aws-messaging</artifactId>
    <version>3.0.1</version>
</dependency>

2. 适配AWS SDK v2的客户端配置

AWSpring 3.x使用AWS SDK v2,原有的AmazonSQSAsync(SDK v1)需要替换为SqsAsyncClient,修改配置类:

@Configuration
public class SQSConfig {

    @Value("${cloud.aws.region.static}")
    private String region;

    @Value("${cloud.aws.credentials.access-key}")
    private String accessKeyId;

    @Value("${cloud.aws.credentials.secret-key}")
    private String secretAccessKey;

    @Value("${cloud.aws.queue.uri}")
    private String sqsUrl;

    @Bean
    public SqsAsyncClient sqsAsyncClient() {
        return SqsAsyncClient.builder()
                .endpointOverride(URI.create(sqsUrl))
                .region(Region.of(region))
                .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKeyId, secretAccessKey)))
                .build();
    }

    @Bean
    public QueueMessagingTemplate queueMessagingTemplate(SqsAsyncClient sqsAsyncClient) {
        return new QueueMessagingTemplate(sqsAsyncClient);
    }

    @Bean
    public MessageConverter messageConverter(ObjectMapper objectMapper) {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setObjectMapper(objectMapper);
        converter.setSerializedPayloadClass(String.class);
        converter.setStrictContentTypeMatch(false);
        return converter;
    }
}

3. 调整监听器的消息接收逻辑

先接收原始字符串消息确认是否能获取到内容,再进行解析,避免转换失败导致消息被静默丢弃:

@Component
public class SQSListener {

    private static final Logger log = LoggerFactory.getLogger(SQSListener.class);
    private final ObjectMapper objectMapper;

    public SQSListener(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @SqsListener("sample-queue.fifo")
    public void receiveMessage(String messagePayload) throws JsonProcessingException {
        log.info("Raw message received: {}", messagePayload);
        // 转换为Map类型
        Map<String, Object> message = objectMapper.readValue(messagePayload, new TypeReference<>() {});
        log.info("Parsed message: {}", message);
    }
}

4. 额外排查点

  • 确认队列URL正确性:LocalStack的FIFO队列URL格式通常为http://localhost:4566/000000000000/sample-queue.fifo,可直接在@SqsListener中填写完整URL测试:@SqsListener("http://localhost:4566/000000000000/sample-queue.fifo")
  • 检查LocalStack状态:通过CLI命令确认队列存在且有消息:
    aws --endpoint-url=http://localhost:4566 sqs receive-message --queue-url http://localhost:4566/000000000000/sample-queue.fifo
    
  • 提升日志级别:在application.yml中添加日志配置,查看监听器初始化和消息轮询细节:
    logging:
      level:
        io.awspring.cloud: DEBUG
        org.springframework.messaging: DEBUG
    

内容的提问来源于stack exchange,提问作者Diego Nieto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:43:02