Entwickeln Sie eine Java-Anwendung, die Amazon SQS verwendet (Teil 1).

Über diesen Artikel

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.

Was ist Amazon SQS?

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

Verwenden von Elastic MQ

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.

ElasticMQ - Github

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.

Zugriff mit AWS SDK für Java

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>

Verbindung zu SQS (Elastic MQ)

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();

Zugriff auf Warteschlangeninformationen

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);

Nachrichten senden und empfangen

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);
    });

Trennen Sie die Verbindung zum SQS

Schließen Sie die Verbindung, wenn der Vorgang abgeschlossen ist. Rufen Sie einfach close () auf.

sqsClient.close();

Na nächstes Mal

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

Entwickeln Sie eine Java-Anwendung, die Amazon SQS verwendet (Teil 1).
Entwickeln Sie eine Java-Anwendung, die Amazon SQS verwendet (Teil 2).
Eine Bat-Datei, die Java in Windows verwendet
So implementieren Sie einen Job, der die Java-API in JobScheduler verwendet
Greifen Sie über eine Java-Anwendung auf Teradata zu
Erstellen Sie mit Docker CE für Windows eine Webanwendungsentwicklungsumgebung, die Java, MySQL und Redis verwendet
Erstellen einer Entwicklungsumgebung für Java-Webanwendungen mit Docker für Mac Teil1
Erstellen Sie mit Docker für Mac Teil2 eine Entwicklungsumgebung für Java-Webanwendungen
[Java] Implementieren Sie eine Funktion, die eine im Builder-Muster implementierte Klasse verwendet
Ich möchte eine Webanwendung entwickeln!
Erstellen einer Matrixklasse in Java Teil 1
Stellen Sie über eine Java-Anwendung eine Verbindung zu Aurora (MySQL) her
CICS-Java-Anwendung ausführen- (1) Führen Sie eine einfache Beispielanwendung aus