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

1概要

このチュートリアルでは、Java SDKを使用してAmazonのhttps://aws.amazon.com/sqs/[SQS](Simple Queue Service)を使用する方法について説明します。

2前提条件

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

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

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

3キューを作成する

SQSクライアントを設定したら、** キューを作成するのはかなり簡単です。

3.1. 標準キューを作成する

標準キューを作成する方法を見てみましょう。これを行うには、** __ CreateQueueRequestのインスタンスを作成する必要があります。

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

3.2. FIFOキューを作成する

FIFOを作成することは、標準キューを作成することに似ています。以前と同様に、引き続き CreateQueueRequest のインスタンスを使用します。今回のみ、** キュー属性を渡し、 FifoQueue 属性を true に設定する必要があります。

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

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

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

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

メッセージを標準キューに送信するには、__SendMessageRequestのインスタンスを作成する必要があります。

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

Map<String, MessageAttributeValue> 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キューへのメッセージの投稿

この場合の唯一の違いは、メッセージが属するhttps://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html[ group ]を指定する必要があることです。 **

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

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

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

  • 単一のリクエストを使用して、複数のメッセージをキューに投稿することもできます。

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

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

5キューからメッセージを読む

ReceiveMessageRequestのインスタンスで receiveMessage() __methodを呼び出すことで、キューからメッセージを受信できます。

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

List<Message> sqsMessages = sqs.receiveMessage(receiveMessageRequest).getMessages();

withMaxNumberOfMessages()を使用して、キューから取得するメッセージ数を指定します。ただし、最大数は 10__です。

メソッド withWaitTimeSeconds() は__httpsを有効にします。 SQSに送信するメッセージリクエスト

簡単に言えば、これはメッセージを取得するために指定された秒数まで待つことを意味します。その期間中キューにメッセージがない場合、要求は空に戻ります。その間にメッセージがキューに到着すると、それが返されます。

与えられたメッセージの属性と本文を取得することができます。

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

6. キューからメッセージを削除する

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

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

7. デッドレターキュー

  • https://en.wikipedia.org/wiki/Dead letter queue[デッドレターキュー]は、そのベースキューと同じタイプである必要があります - ** ベースキューがFIFOの場合はFIFO、ベースがFIFOの場合は標準であるキューは標準です。この例では、標準のキューを使用します。

最初にしなければならないことは、デッドレターキューになるものを作成することです。

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

次に、新しく作成したキューのhttps://docs.aws.amazon.com/general/latest/gr/aws-arns- and-namespaces.html[ARN(Amazon Resource Name)]を取得します。**

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

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

最後に、この新しく作成されたキューを元の標準キューの配信不能キューに設定します。

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

sqs.setQueueAttributes(queueAttributesRequest);
  • __SetQueueAttributesRequest instanceを構築するときに addAttributesEntry()__メソッドに設定したJSONパケットには、必要な情報が含まれています。正しく、そして私たちのデッドレターキューに送られます。

deadLetterTargetArn 属性は、標準キューを新しく作成された送達不能キューを指します。

8モニタリング

SDKを使用して、特定のキューに現在入っているメッセージの数、およびhttps://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html[in flight]がいくつあるかを確認できます。 ** 最初に、 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")));

より詳細な監視はhttps://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-monitoring-using-cloudwatch.html[Amazon Cloud Watch]を使用して実現できます。

9結論

この記事では、AWS Java SDKを使用してSQSキューを管理する方法を説明しました。

いつものように、この記事で使用されているすべてのコードサンプルはhttps://github.com/eugenp/tutorials/tree/master/aws[GitHubに掲載]にあります。