Développer une application Java qui utilise Amazon SQS (partie 1)

À propos de cet article

J'ai recherché comment utiliser Amazon SQS dans les applications Java pour un certain travail. Je n'ai pas utilisé SQS après tout, mais voici ce que j'ai recherché.

Qu'est-ce qu'Amazon SQS?

Amazon SQS (Simple Queue Service) est un service de mise en file d'attente de messages géré disponible sur AWS. Il est disponible à partir de diverses applications utilisant le kit AWS SDK. Les détails sont ci-dessous.

Documentation Amazon Simple Queue Service

Utilisation d'Elastic MQ

En fait, je ne pouvais pas utiliser mon compte AWS pour diverses raisons. J'ai donc essayé d'utiliser Elastic MQ qui peut utiliser la messagerie avec une interface compatible SQS.

ElasticMQ - Github

Cette fois, nous utiliserons l'image Docker suivante.

$ docker run --name test-sqs -p 9324:9324 softwaremill/elasticmq
Unable to find image 'softwaremill/elasticmq:latest' locally
latest: Pulling from softwaremill/elasticmq
・ ・ ・
07:14:26.858 [main] INFO  org.elasticmq.server.Main$ - Starting ElasticMQ server (0.14.7) ...
07:14:27.625 [elasticmq-akka.actor.default-dispatcher-3] INFO  akka.event.slf4j.Slf4jLogger - Slf4jLogger started
07:14:28.722 [elasticmq-akka.actor.default-dispatcher-3] INFO  o.e.rest.sqs.TheSQSRestServerBuilder - Started SQS rest server, bind address 0.0.0.0:9324, visible server address http://localhost:9324
07:14:28.723 [main] INFO  org.elasticmq.server.Main$ - === ElasticMQ server (0.14.7) started in 2402 ms ===

Essayez d'y accéder avec l'AWS CLI. Définissez un identifiant factice à l'avance.

$ aws configure 
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxx
・ ・ ・

Créez une file d'attente et essayez d'envoyer un message. (Il existe deux types de files d'attente qui peuvent être créées dans SQS: les files d'attente standard et les files d'attente FIFO, mais cet article utilise des files d'attente standard.) Vous devez spécifier l'option --endpoint-url pour accéder au conteneur Elastic MQ exécuté localement.

$ aws sqs create-queue --queue-name test --endpoint-url http://localhost:9324
{
    "QueueUrl": "http://localhost:9324/queue/testqueue"
}

$ aws sqs send-message --queue-url http://localhost:9324/queue/testqueue --message-body "THIS IS TEST MESSAGE." --endpoint-url http://localhost:9324
{
    "MD5OfMessageBody": "81fe6881acb296073763f9e5af225aa9",
    "MD5OfMessageAttributes": "d41d8cd98f00b204e9800998ecf8427e",
    "MessageId": "bfb653eb-390a-45d1-bf26-bf52d795099e"
}

Reçoit les messages en file d'attente.

$ aws sqs receive-message --queue-url http://localhost:9324/queue/testqueue --endpoint-url http://localhost:9324
{
    "Messages": [
        {
            "MessageId": "bfb653eb-390a-45d1-bf26-bf52d795099e",
            "ReceiptHandle": "bfb653eb-390a-45d1-bf26-bf52d795099e#eea50e0b-dd35-4caf-bce8-479f4b1168f3",
            "MD5OfBody": "81fe6881acb296073763f9e5af225aa9",
            "Body": "THIS IS TEST MESSAGE."
        }
    ]
}

À propos, SQS ne supprime pas automatiquement les messages reçus de la file d'attente. Après une certaine période de temps après la réception du message, le message peut être reçu à nouveau (délai de visibilité). Par conséquent, supprimez explicitement le message reçu comme indiqué ci-dessous.

$ aws sqs delete-message --queue-url http://localhost:9324/queue/testqueue --endpoint-url http://localhost:9324 --receipt-handle bfb653eb-390a-45d1-bf26-bf52d795099e#28831fc9-1c77-44e1-813d-7715bde62312

Comme vous pouvez le voir, Elastic MQ peut être utilisé de la même manière que SQS à l'aide de l'AWS CLI.

Accès à l'aide du kit AWS SDK pour Java

Passons maintenant au sujet principal et expliquons comment développer une application Java qui accède à SQS. Tout d'abord, utilisez le kit AWS SDK pour Java 2.0 fourni par AWS.

Comment démarrer AWS SDK for Java 2.0 --AWS SDK for Java

Si vous utilisez Maven, vous ajouteriez la dépendance à pom.xml comme suit: (Ajout uniquement des dépendances pour SQS, pas de l'ensemble du SDK)

	<dependencyManagement>
	  <dependencies>
	    <dependency>
	      <groupId>software.amazon.awssdk</groupId>
	      <artifactId>bom</artifactId>
	      <version>2.7.0</version>
	      <type>pom</type>
	      <scope>import</scope>
	    </dependency>
	  </dependencies>
	</dependencyManagement>
・ ・ ・
     <dependencies>
	    <dependency>
	      <groupId>software.amazon.awssdk</groupId>
	        <artifactId>sqs</artifactId>
	    </dependency>
     </dependencies>

Connexion à SQS (Elastic MQ)

Enfin, je vais coder Java. Tout d'abord, en ce qui concerne la connexion au service, il est nécessaire de définir les informations d'identification et l'URL du point de terminaison appropriées pour le générateur de client fourni par le SDK. Comme mentionné précédemment dans l'AWS CLI, vous devez explicitement remplacer l'URL du point de terminaison pour vous connecter à ElasticMQ (appelez endpointOverride ()).

    SqsClient sqsClient = SqsClient.builder()
            .credentialsProvider(DefaultCredentialsProvider.create())
            .region(Region.US_EAST_1)
            .endpointOverride(new URI("http://localhost:9324")) //URL du conteneur Elastic MQ
            .build();

Accès aux informations de file d'attente

Obtenons la liste des files d'attente créées sur ElasticMQ et l'URL de la file d'attente créée avec CLI plus tôt. À partir de là, vous pouvez consulter l'exemple de code fourni par AWS sur le lien ci-dessous. Exemple d'Amazon SQS utilisant AWS SDK pour Java

    String prefix = "test";
    ListQueuesRequest listQueuesRequest = ListQueuesRequest.builder().queueNamePrefix(prefix).build();
    ListQueuesResponse listQueuesResponse = sqsClient.listQueues(listQueuesRequest);
    for (String url : listQueuesResponse.queueUrls()) {
        System.out.println(url);
    }

    String queueName = "testqueue";
    GetQueueUrlResponse getQueueUrlResponse =
        sqsClient.getQueueUrl(GetQueueUrlRequest.builder().queueName(queueName).build());
    String queueUrl = getQueueUrlResponse.queueUrl();
    System.out.println(queueUrl);

Envoyer et recevoir des messages

Envoyez et recevez des messages à l'aide de l'URL de file d'attente obtenue ci-dessus. Bien que cela ne soit pas abordé en détail ici, le SDK prend également en charge l'envoi par lots de plusieurs messages.

//Envoyer un message
    SendMessageResponse res = 
        sqsClient.sendMessage(
            SendMessageRequest.builder()
            .queueUrl(queueUrl)
            .messageBody("Hello world!")
            .delaySeconds(10)
            .build());

//Recevoir un message
    ReceiveMessageRequest receiveMessageRequest = 
        ReceiveMessageRequest.builder()
          .queueUrl(queueUrl)
          .maxNumberOfMessages(5)
          .build();
    List<Message> messages= sqsClient.receiveMessage(receiveMessageRequest).messages();
    messages.forEach(m -> System.out.println(m.body()));

Et n'oubliez pas de le supprimer comme vous l'avez fait avec CLI.

    messages.forEach(m -> {
        DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder()
          .queueUrl(queueUrl)
          .receiptHandle(m.receiptHandle())
          .build();
        DeleteMessageResponse delRes = 
            sqsClient.deleteMessage(deleteMessageRequest);
    });

Se déconnecter de SQS

Fermez la connexion lorsque le processus est terminé. Appelez simplement close ().

sqsClient.close();

Eh bien la prochaine fois

Qu'est-ce que tu penses. Il se peut que le code soit un peu redondant. Si vous faites attention à la connexion, Elastic MQ semble être suffisamment utilisable pour le développement.

La prochaine fois souhaite contester l'accès à l'aide de JMS et Spring.

Recommended Posts

Développer une application Java qui utilise Amazon SQS (partie 1)
Développer une application Java qui utilise Amazon SQS (partie 2)
Un fichier bat qui utilise Java dans Windows
Comment implémenter un travail qui utilise l'API Java dans JobScheduler
Accéder à Teradata depuis une application Java
Créez un environnement de développement d'applications Web qui utilise Java, MySQL et Redis avec Docker CE pour Windows
Création d'un environnement de développement pour les applications Web Java avec Docker pour Mac Part1
Créer un environnement de développement d'applications Web Java avec Docker pour Mac Part2
[Java] Implémenter une fonction qui utilise une classe implémentée dans le modèle Builder
Je souhaite développer une application web!
Création d'une classe de matrice dans Java Partie 1
Connectez-vous à Aurora (MySQL) depuis une application Java
Application Java CICS-Run - (1) Exécutez un exemple d'application simple