Administración de mensajes de Amazon SQS de gran tamaño mediante Amazon S3 - Amazon Simple Queue Service

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Administración de mensajes de Amazon SQS de gran tamaño mediante Amazon S3

Para administrar mensajes grandes de Amazon Simple Queue Service (Amazon SQS), puede utilizar Amazon Simple Storage Service (Amazon S3) y la biblioteca de clientes extendidos de Amazon SQS para Java. Esto resulta especialmente útil para almacenar y consumir mensajes de hasta 2 GB. A menos que su aplicación requiera crear colas y dejarlas inactivas o almacenar grandes cantidades de datos en las colas, considere la posibilidad de utilizar Amazon S3 para almacenar sus datos.

Para Java puede utilizar la biblioteca de clientes extendidos de Amazon SQS para Java con el fin de hacer lo siguiente:

  • Especificar si los mensajes se almacenan siempre en Amazon S3 o solo cuando se tamaño supere los 256 KB

  • Enviar un mensaje que haga referencia a un único objeto de mensaje almacenado en un bucket de S3

  • Recuperar el objeto de mensaje desde un bucket de S3

  • Eliminar el objeto de mensaje de un bucket de S3

Puede utilizar la biblioteca de clientes extendidos de Amazon SQS para Java con el fin de administrar mensajes de Amazon SQS mediante Amazon S3.sóloconAWS SDK for Java. No puede hacer esto con elAWS CLI, la consola de Amazon SQS, la API HTTP de Amazon SQS o cualquiera de lasotro AWSSDK.

LaSDK para Javay la biblioteca de clientes extendidos de Amazon SQS para Java requieren el kit de desarrollo J2SE 8.0 o una versión posterior.

Requisitos previos

En el ejemplo siguiente se utiliza el AWS SDK para Java. Para instalar y configurar el SDK, consulte Configurar el SDK para Java de AWS en la Guía para desarrolladores de AWS SDK for Java.

Antes de ejecutar el código de ejemplo, configure sus credenciales de AWS. Para obtener más información, consulteConfigurarAWSCredenciales y regiones para desarrolloen laAWS SDK for JavaGuía para desarrolladores.

Ejemplo: Uso de Amazon S3 para administrar mensajes de Amazon SQS de gran tamaño

En el siguiente ejemplo, se crea un bucket de Amazon S3 con un nombre aleatorio y se añade una regla de ciclo de vida para eliminar de forma permanente los objetos después de 14 días. También crea una cola denominadaMyQueuey envía un mensaje aleatorio que se almacena en un bucket de S3 y tiene más de 256 KB a la cola. Por último, el código recupera el mensaje, devuelve información sobre él y, a continuación, elimina el mensaje, la cola y el bucket.

/* * Copyright 2010-2021 Amazon.com, 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 * * https://aws.amazon.com/apache2.0 * * 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 com.amazon.sqs.javamessaging.AmazonSQSExtendedClient; import com.amazon.sqs.javamessaging.ExtendedClientConfiguration; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.*; import com.amazonaws.services.sqs.AmazonSQS; import com.amazonaws.services.sqs.AmazonSQSClientBuilder; import com.amazonaws.services.sqs.model.*; 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); } }