我正在使用 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
要执行手动确认,我们使用静态方法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/