java从SQS订阅消息 的demo, 要求保证消息可靠投递的例子

要实现从Amazon SQS(Simple Queue Service)订阅消息,并确保消息的可靠投递,可以使用AWS SDK for Java。以下是一个完整的示例代码,展示了如何从SQS队列中接收消息,并处理这些消息以确保可靠性。

前提条件

  1. AWS SDK for Java:确保在你的项目中包含AWS SDK for Java的依赖项。
  2. 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();
        }
    }
}

关键点解析

  1. 接收消息

    • 使用ReceiveMessageRequest从SQS队列中接收消息。
    • maxNumberOfMessages设置一次最多接收10条消息。
    • waitTimeSeconds设置长轮询时间为20秒。
  2. 处理消息

    • 遍历接收到的消息,并进行相应的处理。
    • 在此示例中,仅打印消息内容。
  3. 确认消息

    • 使用DeleteMessageRequest确认消息已处理,并从队列中删除该消息。
    • 这一步确保消息被可靠地处理,并不会再次被接收。

可靠投递

确保消息可靠投递的关键在于:

  1. 长轮询:使用长轮询(waitTimeSeconds)减少空响应的次数,优化接收效率。
  2. 消息删除:在处理完消息后立即删除,确保消息不会重复处理。
posted @ 2024-07-09 00:55  gongchengship  阅读(19)  评论(0编辑  收藏  举报