java从SQS订阅消息 的demo, 要求保证消息可靠投递的例子
要实现从Amazon SQS(Simple Queue Service)订阅消息,并确保消息的可靠投递,可以使用AWS SDK for Java。以下是一个完整的示例代码,展示了如何从SQS队列中接收消息,并处理这些消息以确保可靠性。
前提条件
- AWS SDK for Java:确保在你的项目中包含AWS SDK for Java的依赖项。
- AWS凭证:确保你的AWS凭证配置正确,以便能够访问SQS。
依赖项
在你的Maven项目中,添加以下依赖项到pom.xml
:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sqs</artifactId>
<version>2.17.94</version> <!-- 请使用最新版本 -->
</dependency>
示例代码
以下是一个示例Java代码,用于从SQS队列中订阅消息,并确保消息的可靠投递:
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.*;
import java.util.List;
public class SqsExample {
public static void main(String[] args) {
Region region = Region.US_EAST_1; // 替换为你的AWS区域
String queueUrl = "https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue"; // 替换为你的队列URL
SqsClient sqsClient = SqsClient.builder()
.region(region)
.credentialsProvider(ProfileCredentialsProvider.create())
.build();
receiveMessages(sqsClient, queueUrl);
sqsClient.close();
}
public static void receiveMessages(SqsClient sqsClient, String queueUrl) {
try {
while (true) {
// 接收消息
ReceiveMessageRequest receiveRequest = ReceiveMessageRequest.builder()
.queueUrl(queueUrl)
.maxNumberOfMessages(10)
.waitTimeSeconds(20)
.build();
List<Message> messages = sqsClient.receiveMessage(receiveRequest).messages();
if (!messages.isEmpty()) {
for (Message message : messages) {
// 处理消息
System.out.println("Message received: " + message.body());
// 确认消息
deleteMessage(sqsClient, queueUrl, message);
}
}
}
} catch (SqsException e) {
e.printStackTrace();
}
}
private static void deleteMessage(SqsClient sqsClient, String queueUrl, Message message) {
try {
DeleteMessageRequest deleteRequest = DeleteMessageRequest.builder()
.queueUrl(queueUrl)
.receiptHandle(message.receiptHandle())
.build();
sqsClient.deleteMessage(deleteRequest);
System.out.println("Message deleted: " + message.messageId());
} catch (SqsException e) {
e.printStackTrace();
}
}
}
关键点解析
-
接收消息:
- 使用
ReceiveMessageRequest
从SQS队列中接收消息。 maxNumberOfMessages
设置一次最多接收10条消息。waitTimeSeconds
设置长轮询时间为20秒。
- 使用
-
处理消息:
- 遍历接收到的消息,并进行相应的处理。
- 在此示例中,仅打印消息内容。
-
确认消息:
- 使用
DeleteMessageRequest
确认消息已处理,并从队列中删除该消息。 - 这一步确保消息被可靠地处理,并不会再次被接收。
- 使用
可靠投递
确保消息可靠投递的关键在于:
- 长轮询:使用长轮询(
waitTimeSeconds
)减少空响应的次数,优化接收效率。 - 消息删除:在处理完消息后立即删除,确保消息不会重复处理。