Amazon S3 による大規模な Amazon SQS メッセージの管理 - Amazon Simple Queue Service


Amazon S3 による大規模な Amazon SQS メッセージの管理

大規模な Amazon Simple Queue Service (Amazon SQS) メッセージを管理するには、Amazon Simple Storage Service (Amazon S3) と Java 向け Amazon SQS 拡張クライアントライブラリを使用できます。これは特に、2 GB までのメッセージを保存および処理するのに役立ちます。アプリケーションで、キューを連続して作成して非アクティブな状態のままにするか、大量のデータをキューに保存する必要がない限り、データの保存に Amazon S3 を使用することを検討してください。

Amazon SQS Java 拡張クライアントライブラリは、以下のことを実行するために使用できます。

  • メッセージを常に Amazon S3 に保存するか、メッセージのサイズが 256 KB を超える場合のみ保存するかを指定する

  • S3 バケットに保存されている単一のメッセージオブジェクトを参照するメッセージを送信する

  • S3 バケットからメッセージオブジェクトを取得する

  • S3 バケットからメッセージオブジェクトを削除する

Java 用 Amazon SQS 拡張クライアントライブラリを使用して、Amazon S3 を使用して Amazon SQS メッセージを管理できます。のみとAWS SDK for Java。これを実行するには、AWS CLI、Amazon SQS コンソール、Amazon SQS HTTP API、またはその他 AWSSDK

-SDK for Javaおよび Amazon SQS Extended Client Library for Java には、J2SE Development Kit 8.0 以降が必要です。


次の例では、AWS Java SDK を使用しています。SDK をインストールしてセットアップするには、のセットアップAWSSDK for Java()AWS SDK for Java開発者ガイド

サンプルコードを実行する前に、AWS の認証情報を設定します。詳細については、「」を参照してください。セットアップAWS開発用の認証情報とリージョン()AWS SDK for Java開発者ガイド

例: Amazon S3 を使用して大規模な Amazon SQS メッセージを管理する

次の例では、ランダムな名前で Amazon S3 バケットを作成し、ライフサイクルルールを追加して、14 日後にオブジェクトを完全に削除します。また、という名前のキューを作成しますMyQueueS3 バケットに保存され、キューに 256 KB を超えるランダムなメッセージを送信します。最後に、コードはメッセージを取得し、メッセージに関する情報を返して、メッセージ、キュー、およびバケットを削除します。

/* * Copyright 2010-2021, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. * */ import; import; import; import; import*; import; import; import*; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import java.util.Arrays; import java.util.List; import java.util.UUID; public class SQSExtendedClientExample { // Create an Amazon S3 bucket with a random name. private final static String S3_BUCKET_NAME = UUID.randomUUID() + "-" + DateTimeFormat.forPattern("yyMMdd-hhmmss").print(new DateTime()); public static void main(String[] args) { /* * Create a new instance of the builder with all defaults (credentials * and region) set automatically. For more information, see * Creating Service Clients in the AWS SDK for Java Developer Guide. */ final AmazonS3 s3 = AmazonS3ClientBuilder.defaultClient(); /* * Set the Amazon S3 bucket name, and then set a lifecycle rule on the * bucket to permanently delete objects 14 days after each object's * creation date. */ final BucketLifecycleConfiguration.Rule expirationRule = new BucketLifecycleConfiguration.Rule(); expirationRule.withExpirationInDays(14).withStatus("Enabled"); final BucketLifecycleConfiguration lifecycleConfig = new BucketLifecycleConfiguration().withRules(expirationRule); // Create the bucket and allow message objects to be stored in the bucket. s3.createBucket(S3_BUCKET_NAME); s3.setBucketLifecycleConfiguration(S3_BUCKET_NAME, lifecycleConfig); System.out.println("Bucket created and configured."); /* * Set the Amazon SQS extended client configuration with large payload * support enabled. */ final ExtendedClientConfiguration extendedClientConfig = new ExtendedClientConfiguration() .withLargePayloadSupportEnabled(s3, S3_BUCKET_NAME); final AmazonSQS sqsExtended = new AmazonSQSExtendedClient(AmazonSQSClientBuilder .defaultClient(), extendedClientConfig); /* * Create a long string of characters for the message object which will * be stored in the bucket. */ int stringLength = 300000; char[] chars = new char[stringLength]; Arrays.fill(chars, 'x'); final String myLongString = new String(chars); // Create a message queue for this example. final String QueueName = "MyQueue" + UUID.randomUUID().toString(); final CreateQueueRequest createQueueRequest = new CreateQueueRequest(QueueName); final String myQueueUrl = sqsExtended .createQueue(createQueueRequest).getQueueUrl(); System.out.println("Queue created."); // Send the message. final SendMessageRequest myMessageRequest = new SendMessageRequest(myQueueUrl, myLongString); sqsExtended.sendMessage(myMessageRequest); System.out.println("Sent the message."); // Receive the message. final ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl); List<Message> messages = sqsExtended .receiveMessage(receiveMessageRequest).getMessages(); // Print information about the message. for (Message message : messages) { System.out.println("\nMessage received."); System.out.println(" ID: " + message.getMessageId()); System.out.println(" Receipt handle: " + message.getReceiptHandle()); System.out.println(" Message body (first 5 characters): " + message.getBody().substring(0, 5)); } // Delete the message, the queue, and the bucket. final String messageReceiptHandle = messages.get(0).getReceiptHandle(); sqsExtended.deleteMessage(new DeleteMessageRequest(myQueueUrl, messageReceiptHandle)); System.out.println("Deleted the message."); sqsExtended.deleteQueue(new DeleteQueueRequest(myQueueUrl)); System.out.println("Deleted the queue."); deleteBucketAndAllContents(s3); System.out.println("Deleted the bucket."); } private static void deleteBucketAndAllContents(AmazonS3 client) { ObjectListing objectListing = client.listObjects(S3_BUCKET_NAME); while (true) { for (S3ObjectSummary objectSummary : objectListing .getObjectSummaries()) { client.deleteObject(S3_BUCKET_NAME, objectSummary.getKey()); } if (objectListing.isTruncated()) { objectListing = client.listNextBatchOfObjects(objectListing); } else { break; } } final VersionListing list = client.listVersions( new ListVersionsRequest().withBucketName(S3_BUCKET_NAME)); for (S3VersionSummary s : list.getVersionSummaries()) { client.deleteVersion(S3_BUCKET_NAME, s.getKey(), s.getVersionId()); } client.deleteBucket(S3_BUCKET_NAME); } }