JavaでAmazon SQSキューを管理する

JavaでAmazon SQSキューを管理する

1. 概要

このチュートリアルでは、use Amazon’s SQS (Simple Queue Service) using the Java SDKを実行する方法について説明します。

2. 前提条件

Amazon AWS SDK for SQSを使用するために必要なMavenの依存関係、AWSアカウント設定、およびクライアント接続は、this article hereと同じです。

前の記事で説明したようにAWSCredentials,のインスタンスを作成したとすると、先に進んでSQSクライアントを作成できます。

AmazonSQS sqs = AmazonSQSClientBuilder.standard()
  .withCredentials(new AWSStaticCredentialsProvider(credentials))
  .withRegion(Regions.US_EAST_1)
  .build();

3. キューの作成

SQSクライアントをセットアップしたら、creating queues is fairly straightforward.

3.1. 標準キューの作成

標準キューを作成する方法を見てみましょう。 これを行うには、we’ll need to create an instance of CreateQueueRequest:

CreateQueueRequest createStandardQueueRequest = new CreateQueueRequest("example-queue");
String standardQueueUrl = sqs.createQueue(createStandardQueueRequest).getQueueUrl();

3.2. FIFOキューの作成

FIFOの作成は、標準キューの作成に似ています。 以前と同様に、引き続きCreateQueueRequestのインスタンスを使用します。 今回だけ、we’ll have to pass in queue attributes, and set the FifoQueue attribute to true:

Map queueAttributes = new HashMap<>();
queueAttributes.put("FifoQueue", "true");
queueAttributes.put("ContentBasedDeduplication", "true");
CreateQueueRequest createFifoQueueRequest = new CreateQueueRequest(
  "example-queue.fifo").withAttributes(queueAttributes);
String fifoQueueUrl = sqs.createQueue(createFifoQueueRequest)
  .getQueueUrl();

4. キューへのメッセージの投稿

キューを設定したら、メッセージの送信を開始できます。

4.1. 標準キューへのメッセージの投稿

標準キューにメッセージを送信するには、have to create an instance of SendMessageRequest.

次に、このリクエストにメッセージ属性のマップを添付します。

Map messageAttributes = new HashMap<>();
messageAttributes.put("AttributeOne", new MessageAttributeValue()
  .withStringValue("This is an attribute")
  .withDataType("String"));

SendMessageRequest sendMessageStandardQueue = new SendMessageRequest()
  .withQueueUrl(standardQueueUrl)
  .withMessageBody("A simple message.")
  .withDelaySeconds(30)
  .withMessageAttributes(messageAttributes);

sqs.sendMessage(sendMessageStandardQueue);

withDelaySeconds() は、メッセージがキューに到着するまでの時間を指定します。

4.2. FIFOキューへのメッセージの投稿

この場合の唯一の違いは、we’ll have to specify the group to which the message belongs:

SendMessageRequest sendMessageFifoQueue = new SendMessageRequest()
  .withQueueUrl(fifoQueueUrl)
  .withMessageBody("Another simple message.")
  .withMessageGroupId("example-group-1")
  .withMessageAttributes(messageAttributes);

上記のコード例でわかるように、withMessageGroupId().を使用してグループを指定します

4.3. 複数のメッセージをキューに投稿する

post multiple messages to a queue, using a single request.もできます。SendMessageBatchRequestのインスタンスを使用して送信するSendMessageBatchRequestEntryのリストを作成します。

List  messageEntries = new ArrayList<>();
messageEntries.add(new SendMessageBatchRequestEntry()
  .withId("id-1")
  .withMessageBody("batch-1")
  .withMessageGroupId("example-group-1"));
messageEntries.add(new SendMessageBatchRequestEntry()
  .withId("id-2")
  .withMessageBody("batch-2")
  .withMessageGroupId("example-group-1"));

SendMessageBatchRequest sendMessageBatchRequest
 = new SendMessageBatchRequest(fifoQueueUrl, messageEntries);
sqs.sendMessageBatch(sendMessageBatchRequest);

5. キューからのメッセージの読み取り

キューからinvoking the receiveMessage() method on an instance of ReceiveMessageRequest:でメッセージを受信できます

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(fifoQueueUrl)
  .withWaitTimeSeconds(10)
  .withMaxNumberOfMessages(10);

List sqsMessages = sqs.receiveMessage(receiveMessageRequest).getMessages();

withMaxNumberOfMessages(),を使用して、キューから取得するメッセージの数を指定します—最大は10であることに注意してください。

メソッドwithWaitTimeSeconds()long-polling.を有効にします。ロングポーリングは、SQSに送信する受信メッセージリクエストの数を制限する方法です。 

簡単に言うと、これは、指定された秒数までメッセージを取得するのを待つことを意味します。 その期間中にメッセージがキューにない場合、リクエストは空を返します。 その間にメッセージがキューに到着すると、そのメッセージが返されます。

get the attributes and body of a given message:できます

sqsMessages.get(0).getAttributes();
sqsMessages.get(0).getBody();

6. キューからのメッセージの削除

メッセージを削除するには、DeleteMessageRequestを使用します。

sqs.deleteMessage(new DeleteMessageRequest()
  .withQueueUrl(fifoQueueUrl)
  .withReceiptHandle(sqsMessages.get(0).getReceiptHandle()));

7. デッドレターキュー

A dead letter queue must be of the same type as its base queue — itは、ベースキューがFIFOの場合はFIFOである必要があり、ベースキューが標準の場合は標準である必要があります。 この例では、標準のキューを使用します。

最初に行う必要があるのは、create what will become our dead letter queue:です。

String deadLetterQueueUrl = sqs.createQueue("example-dead-letter-queue").getQueueUrl();

次に、get our newly created queue’s ARN (Amazon Resource Name):

GetQueueAttributesResult deadLetterQueueAttributes = sqs.getQueueAttributes(
  new GetQueueAttributesRequest(deadLetterQueueUrl)
    .withAttributeNames("QueueArn"));

String deadLetterQueueARN = deadLetterQueueAttributes.getAttributes()
  .get("QueueArn");

最後に、set this newly created queue to be our original standard queue’s dead letter queue:

SetQueueAttributesRequest queueAttributesRequest = new SetQueueAttributesRequest()
  .withQueueUrl(standardQueueUrl)
  .addAttributesEntry("RedrivePolicy",
    "{\"maxReceiveCount\":\"2\", "
      + "\"deadLetterTargetArn\":\"" + deadLetterQueueARN + "\"}");

sqs.setQueueAttributes(queueAttributesRequest);

The JSON packet we set in the addAttributesEntry() method when building our SetQueueAttributesRequest instance contains the information we needmaxReceiveCount2です。つまり、メッセージがこれほど何度も受信された場合、メッセージは正しく処理されていないと見なされ、デッドレターキューに送信されます。

deadLetterTargetArn属性は、標準キューが新しく作成されたデッドレターキューを指します。

8. モニタリング

check how many messages are currently in a given queue, and how many are in flight with the SDK.を実行できますまず、GetQueueAttributesRequest. を作成する必要があります

そこから、キューの状態を確認します。

GetQueueAttributesRequest getQueueAttributesRequest
  = new GetQueueAttributesRequest(standardQueueUrl)
    .withAttributeNames("All");
GetQueueAttributesResult getQueueAttributesResult
  = sqs.getQueueAttributes(getQueueAttributesRequest);
System.out.println(String.format("The number of messages on the queue: %s",
  getQueueAttributesResult.getAttributes()
    .get("ApproximateNumberOfMessages")));
System.out.println(String.format("The number of messages in flight: %s",
  getQueueAttributesResult.getAttributes()
    .get("ApproximateNumberOfMessagesNotVisible")));

Amazon Cloud Watchを使用すると、より詳細な監視を実現できます。

9. 結論

この記事では、manage SQS queues using the AWS Java SDK.の方法を見てきました

いつものように、記事で使用されているすべてのコードサンプルはover on GitHubで見つけることができます。