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é.
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
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.
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.
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>
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();
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);
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);
});
Fermez la connexion lorsque le processus est terminé. Appelez simplement close ().
sqsClient.close();
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