網頁

2022/3/30

Java 本機接收SQS queue的訊息

本範例在locahost的Java應用程式以AWS的SDK aws-sdk-java-v2從Kinesis Data Streams取得資料。


範例環境:

  • Java 17
  • Maven


Prerequisites

參考「AWS 建立IAM管理使用者及credentials」設定存取AWS需要的IAM管理員credentials。

參考「AWS console建立SQS queue範例」建立一個名稱為DemoQueue的SQS queue並發送一個"hello"訊息。


下載AWS SDK for Java 2.x

在專案的pom.xml加入以下需要的AWS SDK for Java的SQS依賴。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>bom</artifactId>
            <version>2.16.60</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>sqs</artifactId>
</dependency>

設定好pom.xml在專案執行mvn install下載依賴。


從SQS queue接收訊息

呼叫SqsClient.builder()輸入region參數建立SqsClient來獲取SQS queue的訊息。AWS SDK預設會讀取$HOME/.aws/credentials的access keys來通過權限驗證。

由於ReceiveMessageRequest.waitTimeSeconds預設為0為short polling,所以可能接收到空訊息。

Main

package com.abc.demo;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.*;

import java.util.Collections;
import java.util.List;

public class Main {

    public static void main(String[] arges) {
        SqsClient sqsClient = SqsClient.builder()
                .region(Region.AP_NORTHEAST_1)
                .build();
        String queueUrl = getQueueUrl(sqsClient);
        List<Message> messageList = getMessageListFromSQS(sqsClient, queueUrl);

        if (!messageList.isEmpty()) {
            var message = messageList.get(0);
            System.out.println(message.messageId());
            System.out.println(message.body());
        }

    }

    public static String getQueueUrl(SqsClient sqsClient) {
        GetQueueUrlResponse getQueueUrlResponse =
                sqsClient.getQueueUrl(
                        GetQueueUrlRequest.builder()
                                .queueName("DemoQueue")
                                .build());
        return getQueueUrlResponse.queueUrl();
    }

    public static List<Message> getMessageListFromSQS(SqsClient sqsClient, String queueUrl) {
        try {
            ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder()
                    .queueUrl(queueUrl)
                    .maxNumberOfMessages(1)
                    .visibilityTimeout(5)
                    .build();
            return sqsClient.receiveMessage(receiveMessageRequest).messages();
        } catch (SqsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
        }
        return Collections.emptyList();
    }

}

github


測試

執行Java應用程式印出接收訊息的Message ID及訊息內容如下。

aadeb265-108f-4d02-9aa3-01b3781e4607
hello


沒有留言:

張貼留言