java從SQS訂閱訊息 的demo, 要求保證訊息可靠投遞的例子

gongchengship發表於2024-07-09

要實現從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. 訊息刪除:在處理完訊息後立即刪除,確保訊息不會重複處理。

相關文章