Ich habe untersucht, wie Amazon SQS in Java-Anwendungen für einen bestimmten Job verwendet werden kann. Ich habe SQS schließlich nicht verwendet, aber hier ist, was ich recherchiert habe.
Amazon SQS (Simple Queue Service) ist ein verwalteter Nachrichtenwarteschlangendienst, der in AWS verfügbar ist. Es ist in verschiedenen Anwendungen mit dem AWS SDK verfügbar. Details sind unten.
Dokumentation zum Amazon Simple Queue Service
Eigentlich konnte ich mein AWS-Konto aus verschiedenen Gründen nicht verwenden. Also habe ich versucht, Elastic MQ zu verwenden, das Messaging mit SQS-kompatibler Schnittstelle verwenden kann.
Dieses Mal verwenden wir das folgende Docker-Image.
$ 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 ===
Versuchen Sie, mit der AWS CLI darauf zuzugreifen. Legen Sie im Voraus einen Dummy-Berechtigungsnachweis fest.
$ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxx
・ ・ ・
Erstellen Sie eine Warteschlange und versuchen Sie, eine Nachricht zu senden. (In SQS können zwei Arten von Warteschlangen erstellt werden: Standardwarteschlangen und FIFO-Warteschlangen. In diesem Artikel werden jedoch Standardwarteschlangen verwendet.) Sie müssen die Option --endpoint-url angeben, um auf den lokal ausgeführten Elastic MQ-Container zugreifen zu können.
$ 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"
}
Empfängt Nachrichten in der Warteschlange.
$ 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."
}
]
}
Übrigens entfernt SQS empfangene Nachrichten nicht automatisch aus der Warteschlange. Nach Ablauf einer bestimmten Zeit nach dem Empfang der Nachricht kann die Nachricht erneut empfangen werden (Zeitlimit für Sichtbarkeit). Löschen Sie daher die empfangene Nachricht explizit wie unten gezeigt.
$ 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
Wie Sie sehen können, kann Elastic MQ auf dieselbe Weise wie SQS mithilfe der AWS-CLI verwendet werden.
Kommen wir nun zum Hauptthema und erklären, wie eine Java-App entwickelt wird, die auf SQS zugreift. Verwenden Sie zunächst das von AWS bereitgestellte AWS SDK für Java 2.0.
So starten Sie AWS SDK für Java 2.0 - AWS SDK für Java
Wenn Sie Maven verwenden, fügen Sie die Abhängigkeit wie folgt zu pom.xml hinzu: (Hinzufügen nur der Abhängigkeiten für SQS, nicht des gesamten 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>
Schließlich werde ich Java codieren. In Bezug auf die Verbindung zum Dienst müssen zunächst die entsprechenden Anmeldeinformationen und die Endpunkt-URL für den vom SDK bereitgestellten Client Builder festgelegt werden. Wie bereits in der AWS-CLI erwähnt, müssen Sie die Endpunkt-URL explizit überschreiben, um eine Verbindung zu ElasticMQ herzustellen (rufen Sie endpointOverride () auf).
SqsClient sqsClient = SqsClient.builder()
.credentialsProvider(DefaultCredentialsProvider.create())
.region(Region.US_EAST_1)
.endpointOverride(new URI("http://localhost:9324")) //URL für den elastischen MQ-Container
.build();
Lassen Sie uns die Liste der in ElasticMQ erstellten Warteschlangen und die URL der zuvor mit CLI erstellten Warteschlange abrufen. Von hier aus können Sie das von AWS bereitgestellte Codebeispiel unter dem folgenden Link überprüfen. Beispiel für Amazon SQS mit AWS SDK für 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);
Senden und Empfangen von Nachrichten unter Verwendung der oben angegebenen Warteschlangen-URL. Obwohl hier nicht im Detail behandelt, unterstützt das SDK auch das Batch-Senden mehrerer Nachrichten.
//Messege senden
SendMessageResponse res =
sqsClient.sendMessage(
SendMessageRequest.builder()
.queueUrl(queueUrl)
.messageBody("Hello world!")
.delaySeconds(10)
.build());
//Erhalte Nachricht
ReceiveMessageRequest receiveMessageRequest =
ReceiveMessageRequest.builder()
.queueUrl(queueUrl)
.maxNumberOfMessages(5)
.build();
List<Message> messages= sqsClient.receiveMessage(receiveMessageRequest).messages();
messages.forEach(m -> System.out.println(m.body()));
Und vergessen Sie nicht, es wie bei CLI zu löschen.
messages.forEach(m -> {
DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder()
.queueUrl(queueUrl)
.receiptHandle(m.receiptHandle())
.build();
DeleteMessageResponse delRes =
sqsClient.deleteMessage(deleteMessageRequest);
});
Schließen Sie die Verbindung, wenn der Vorgang abgeschlossen ist. Rufen Sie einfach close () auf.
sqsClient.close();
Was denken Sie. Es kann sein, dass der Code etwas redundant ist. Wenn Sie auf die Verbindung achten, scheint Elastic MQ für die Entwicklung ausreichend verwendbar zu sein.
Nächstes Mal möchte den Zugriff mit JMS und Spring herausfordern.
Recommended Posts