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 need:maxReceiveCountは2です。つまり、メッセージがこれほど何度も受信された場合、メッセージは正しく処理されていないと見なされ、デッドレターキューに送信されます。
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で見つけることができます。