Amazon S3 を使用した大規模な Amazon SQS メッセージの管理 - Amazon Simple Queue Service


Amazon S3 を使用した大規模な Amazon SQS メッセージの管理

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

Amazon SQS Extended Client Library for Java を使用して、次のことを実行できます。

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

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

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

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

Amazon SQS Extended Client Library for Java を使用して Amazon S3 を使用して Amazon SQS メッセージを管理できます。のみとAWS SDK for Java。これを行うことはできません。AWS CLI、Amazon SQS コンソール、Amazon SQS HTTP API、またはその他 AWSSDK。

-SDK for JavaAmazon SQS Extended Client Library for Java には、J2SE Devopment Kit 8.0 以降が必要です。


次の例では、AWS Java SDK を使用しています。SDK をインストールしてセットアップするには、『AWS SDK for Java デベロッパーガイド』の「AWS SDK for Java のセットアップ」を参照してください。

サンプルコードを実行する前に、AWS の認証情報を設定します。詳しい情報については、AWS SDK for Java デベロッパーガイド開発用 AWS の認証情報およびリージョンのセットアップをご参照ください。

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

次の例では、ランダムな名前で Amazon S3 バケットを作成し、ライフサイクルルールを追加して、14 日後にオブジェクトを完全に削除します。また、という名前のキューを作成します。MyQueueで、S3 バケットに保存され、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); } }