Spring SqsTemplate 手册致谢:如何?

问题描述 投票:0回答:1

我正在使用 Spring Boot 3.2.2 和 Spring Cloud AWS 3.1.0,我需要从 AWS SQS 队列获取消息并在成功处理消息后手动确认它。我可以阅读该消息,但不知道如何手动发送确认。

我创建了一个具有手动确认模式的自定义 SqsTemplate:

@Configuration
public class AwsServicesConfig {

 
  @Bean
  public SqsTemplate customSqsTemplate(SqsAsyncClient sqsAsyncClient) {
    return SqsTemplate.builder()
        .sqsAsyncClient(sqsAsyncClient)
        .configure(options -> options
            // NOTE: manual ACK mode
            .acknowledgementMode(TemplateAcknowledgementMode.MANUAL)
        ).build();
  }
}

@Component
中的逻辑是这样的:

  public List<String> processMessages() {
    var processedMessages = new ArrayList<String>();

    var messages = customSqsTemplate.receiveMany(from -> from.queue("my-queue")
        .maxNumberOfMessages(10),
        String.class
    );

    while (!messages.isEmpty()) {
      messages.forEach(message -> {
         
            doProcess(message);
            processedMessages.add(message);

           // HERE I want to send an ack to the source queue

       });

      messages = sqsTemplate.receiveMany(from -> 
          from.queue(mcSendProperties.getSqs().getDlqUrl())
              .maxNumberOfMessages(MAX_NUMBER_OF_MESSAGES),
          String.class
     );
    }
    return processedMessages;
  }

我在 SqsTemplate 对象上没有找到任何方法来发送 ack。我检查了该项目的 GitHub repo 中的测试,但它只告诉您不应自动发送 ack: https://github.com/awspring/spring-cloud-aws/blob/main/spring-cloud-aws-sqs/src/test/java/io/awspring/cloud/sqs/operations/SqsTemplateTests.java#L770

java spring spring-boot spring-cloud-aws
1个回答
0
投票

要执行手动确认,我们使用静态方法Acknowledgement.acknowledge()

@SqsListener("HowToDoInJava")
public void listen(Message<?> message) {

    LOGGER.info("Message received on the listen method at {}", OffsetDateTime.now());
    Acknowledgement.acknowledge(message);
}

https://howtodoinjava.com/spring-cloud/aws-sqs-with-spring-cloud-aws/

© www.soinside.com 2019 - 2024. All rights reserved.