Senden und Empfangen von Nachrichten für Azure Service Bus-Warteschlangen (Java)
In dieser Schnellstartanleitung erstellen Sie eine Java-App zum Senden und Empfangen von Nachrichten für eine Azure Service Bus-Warteschlange.
Hinweis
In dieser Schnellstartanleitung wird Schritt für Schritt ein einfaches Szenario erläutert, bei dem Sie Nachrichten an eine Service Bus-Warteschlange senden und diese Nachrichten empfangen. Weitere vordefinierte Java-Beispiele für Azure Service Bus finden Sie auf GitHub im Repository mit dem Azure SDK für Java.
Tipp
Wenn Sie mit Azure Service Bus-Ressourcen in einer Spring-Anwendung arbeiten, sollten Sie Spring Cloud Azure als Alternative in Betracht ziehen. Spring Cloud Azure ist ein Open-Source-Projekt, das eine nahtlose Spring-Integration mit Azure-Diensten ermöglicht. Weitere Informationen zu Spring Cloud Azure und ein Beispiel für die Verwendung von Service Bus finden Sie unter Spring Cloud Stream mit Azure Service Bus.
Voraussetzungen
- Ein Azure-Abonnement. Um dieses Tutorial abzuschließen, benötigen Sie ein Azure-Konto. Sie können Ihre MSDN-Abonnentenvorteile aktivieren oder sich für ein kostenloses Konto registrieren.
- Installieren Sie das Azure SDK für Java. Wenn Sie Eclipse verwenden, können Sie das Azure-Toolkit für Eclipse installieren, in dem das Azure SDK für Java enthalten ist. Sie können dann Ihrem Projekt die Microsoft Azure-Bibliotheken für Java hinzufügen. Lesen Sie bei Verwendung von IntelliJ die Informationen unter Installieren des Azure-Toolkits für IntelliJ.
Erstellen eines Namespace im Azure-Portal
Um mit der Verwendung von Service Bus-Nachrichtenentitäten in Azure beginnen zu können, müssen Sie zuerst einen Namespace mit einem in Azure eindeutigen Namen erstellen. Ein Namespace ist ein Bereichscontainer für Service Bus-Ressourcen (Warteschlangen, Themen usw.) innerhalb Ihrer Anwendung.
So erstellen Sie einen Namespace
Melden Sie sich beim Azure-Portal an.
Navigieren Sie zur Seite Alle Dienste.
Wählen Sie im linken Navigationsbereich in der Kategorienliste Integration aus, zeigen Sie mit dem Mauszeiger auf Service Bus, und wählen Sie auf der Service Bus-Kachel die Schaltfläche + aus.
Führen Sie auf der Seite Namespace erstellen auf der Registerkarte Grundlagen die folgenden Schritte aus:
Wählen Sie unter Abonnement ein Azure-Abonnement aus, in dem der Namespace erstellt werden soll.
Wählen Sie unter Ressourcengruppe eine vorhandene Ressourcengruppe für den Namespace aus, oder erstellen Sie eine neue Ressourcengruppe.
Geben Sie einen Namen für den Namespace ein. Der Namespacename sollte den folgenden Namenskonventionen entsprechen:
- Der Name muss innerhalb von Azure eindeutig sein. Das System überprüft sofort, ob dieser Name verfügbar ist.
- Die Länge des Namens beträgt mindestens 6 und maximal 50 Zeichen.
- Der Name darf nur Buchstaben, Zahlen und Bindestriche („-“) enthalten.
- Der Name muss mit einem Buchstaben beginnen und mit einem Buchstaben oder einer Ziffer enden.
- Der Name endet nicht mit „-sb“ oder „-mgmt“.
Wählen Sie unter Standort die Region aus, in der Ihr Namespace gehostet werden soll.
Wählen Sie unter Tarif den Tarif (Basic, Standard oder Premium) für den Namespace aus. Wählen Sie für diesen Schnellstart die Option Standard aus.
Wichtig
Wenn Sie Themen und Abonnements nutzen möchten, wählen Sie entweder Standard oder Premium aus. Themen/Abonnements werden für den Basic-Tarif nicht unterstützt.
Wenn Sie den Tarif Premium auswählen, geben Sie die Anzahl von Messagingeinheiten an. Der Premium-Tarif bietet Ressourcenisolierung auf CPU- und Arbeitsspeicherebene, sodass die einzelnen Workloads voneinander isoliert ausgeführt werden. Dieser Ressourcencontainer wird als Messagingeinheit bezeichnet. Ein Premium-Namespace verfügt über mindestens eine Messagingeinheit. Sie können 1, 2, 4, 8 oder 16 Messagingeinheiten für jeden Service Bus Premium-Namespace auswählen. Weitere Informationen finden Sie unter Service Bus Premium- und Standard-Preisstufe für Messaging.
Wählen Sie am unteren Rand der Seite die Option Bewerten + erstellen aus.
Überprüfen Sie die Einstellungen auf der Seite Überprüfen und erstellen, und wählen Sie Erstellen aus.
Wählen Sie nach der erfolgreichen Bereitstellung der Ressource auf der Bereitstellungsseite Zur Ressource wechseln aus.
Die Startseite für Ihren Service Bus-Namespace wird angezeigt.
Erstellen einer Warteschlange im Azure-Portal
Wählen Sie auf der Seite Service Bus-Namespace im linken Navigationsmenü die Option Warteschlangen aus.
Wählen Sie auf der Seite Warteschlangen auf der Symbolleiste die Option + Warteschlange aus.
Geben Sie einen Namen für die Warteschlange ein, und lassen Sie die anderen Werte unverändert.
Wählen Sie jetzt Erstellen.
Authentifizieren der App bei Azure
In dieser Schnellstartanleitung werden zwei Möglichkeiten zum Herstellen einer Verbindung mit Azure Service Bus gezeigt: kennwortlos und Verbindungszeichenfolge.
Die erste Option zeigt, wie Sie über Ihren Sicherheitsprinzipal in Microsoft Entra ID und die rollenbasierte Zugriffssteuerung (Role-Based Access Control, RBAC) eine Verbindung mit einem Service Bus-Namespace herstellen. Sie müssen sich keine Gedanken darüber machen, dass hartcodierte Verbindungszeichenfolgen in Ihrem Code oder in einer Konfigurationsdatei oder in einem sicheren Speicher wie Azure Key Vault vorhanden sind.
Die zweite Option zeigt, wie Sie mithilfe einer Verbindungszeichenfolge eine Verbindung mit einem Service Bus-Namespace herstellen. Wenn Sie noch nicht mit Azure vertraut sind, ist die Option mit der Verbindungszeichenfolge möglicherweise einfacher. In realen Anwendungen und Produktionsumgebungen wird die kennwortlose Option empfohlen. Weitere Informationen finden Sie unter Authentifizierung und Autorisierung. Weitere Informationen zur kennwortlosen Authentifizierung finden Sie auch auf der Übersichtsseite.
Zuweisen von Rollen zu Ihrem Microsoft Entra-Benutzer
Achten Sie bei der lokalen Entwicklung darauf, dass das Benutzerkonto, das die Verbindung mit Azure Service Bus herstellt, über die korrekten Berechtigungen verfügt. Zum Senden und Empfangen von Nachrichten ist die Rolle Azure Service Bus-Datenbesitzer erforderlich. Um sich selbst diese Rolle zuweisen zu können, benötigen Sie die Rolle „Benutzerzugriffsadministrator“ oder eine andere Rolle, die die Aktion Microsoft.Authorization/roleAssignments/write
umfasst. Sie können einem Benutzer Azure RBAC-Rollen über das Azure-Portal, die Azure CLI oder mit Azure PowerShell zuweisen. Weitere Informationen zu den verfügbaren Bereichen für Rollenzuweisungen finden Sie auf der Seite Grundlegendes zum Bereich von Azure RBAC.
Im folgenden Beispiel wird Ihrem Benutzerkonto die Rolle Azure Service Bus Data Owner
zugewiesen. Diese Rolle bietet Vollzugriff auf Azure Service Bus-Ressourcen. Halten Sie sich in einem echten Szenario an das Prinzip der geringsten Rechte, um Benutzern nur die benötigten Mindestberechtigungen zu erteilen und so die Produktionsumgebung besser zu schützen.
Integrierte Azure-Rollen für Azure Service Bus
Bei Azure Service Bus ist die Verwaltung der Namespaces und aller zugehörigen Ressourcen über das Azure-Portal und die Azure-Ressourcenverwaltungs-API bereits durch das Azure RBAC-Modell geschützt. Azure stellt die folgenden integrierten Azure-Rollen zum Autorisieren des Zugriffs auf einen Service Bus-Namespace bereit:
- Azure Service Bus-Datenbesitzer: ermöglicht den Datenzugriff auf einen Service Bus-Namespace und seine Entitäten (Warteschlangen, Themen, Abonnements und Filter). Ein Mitglied dieser Rolle kann Nachrichten an Warteschlangen oder Themen/Abonnements senden bzw. aus diesen empfangen.
- Azure Service Bus-Datensender: Verwenden Sie diese Rolle, um dem Service Bus-Namespace und seinen Entitäten Sendezugriff zu erteilen.
- Azure Service Bus-Datenempfänger: Verwenden Sie diese Rolle, um Zugriff auf den Service Bus-Namespace und seine Entitäten zu erhalten.
Informationen zum Erstellen einer benutzerdefinierten Rolle finden Sie unter Erforderliche Rechte für Service Bus-Vorgänge.
Hinzufügen eines Microsoft Entra-Benutzers zur Azure Service Bus-Besitzerrolle
Fügen Sie auf Service Bus-Namespace-Ebene Ihren Microsoft Entra-Benutzernamen der Rolle Azure Service Bus-Datenbesitzer hinzu. Dies ermöglicht einer App, die im Kontext Ihres Benutzerkontos ausgeführt wird, Nachrichten an eine Warteschlange oder ein Thema zu senden und Nachrichten aus einer Warteschlange oder einem Abonnement eines Themas zu empfangen.
Wichtig
In der Regel dauert die Verteilung der Rollenzuweisung in Azure ein bis zwei Minuten. In seltenen Fällen kann sie aber bis zu acht Minuten dauern. Wenn bei der ersten Ausführung Ihres Codes Authentifizierungsfehler auftreten, warten Sie einige Momente, und versuchen Sie es dann erneut.
Wenn die Seite „Service Bus-Namespace“ im Azure-Portal nicht geöffnet ist, ermitteln Sie Ihren Service Bus-Namespace über die Hauptsuchleiste oder den linken Navigationsbereich.
Wählen Sie auf der Übersichtsseite im linken Menü die Option Zugriffssteuerung (IAM) aus.
Wählen Sie auf der Seite Zugriffssteuerung (IAM) die Registerkarte Rollenzuweisungen aus.
Wählen Sie im oberen Menü + Hinzufügen und aus dem dann angezeigten Dropdownmenü die Option Rollenzuweisung hinzufügen aus.
Über das Suchfeld können Sie die Ergebnisse für die gewünschte Rolle filtern. Suchen Sie in diesem Beispiel nach
Azure Service Bus Data Owner
, und wählen Sie das entsprechende Ergebnis aus. Klicken Sie dann auf Weiter.Wählen Sie unter Zugriff zuweisen zu die Option Benutzer, Gruppe oder Dienstprinzipal und dann die Option + Mitglieder auswählen aus.
Suchen Sie im Dialogfeld nach Ihrem Microsoft Entra-Benutzernamen (normalerweise Ihre E-Mail-Adresse benutzer@domäne), und wählen Sie unten im Dialogfeld Auswählen aus.
Wählen Sie Überprüfen und zuweisen aus, um zur letzten Seite zu gelangen, und wählen Sie erneut Überprüfen und zuweisen aus, um den Vorgang abzuschließen.
Senden von Nachrichten an eine Warteschlange
In diesem Abschnitt erstellen Sie ein Java-Konsolenprojekt und fügen Code zum Senden von Nachrichten an die von Ihnen weiter oben erstellte Warteschlange hinzu.
Erstellen eines Java-Konsolenprojekts
Erstellen Sie ein Java-Projekt mit Eclipse oder einem Tool Ihrer Wahl.
Konfigurieren Ihrer Anwendung für die Verwendung von Service Bus
Fügen Sie Verweise auf Azure Core- und Azure Service Bus-Bibliotheken hinzu.
Wenn Sie Eclipse verwenden und eine Java-Konsolenanwendung erstellt haben, konvertieren Sie Ihr Java-Projekt in ein Maven-Projekt: Klicken Sie im Fenster Paket-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Konfigurieren->In Maven-Projekt konvertieren aus. Fügen Sie dann Abhängigkeiten zu diesen beiden Bibliotheken hinzu, wie im folgenden Beispiel gezeigt.
Aktualisieren Sie die Datei pom.xml
, um Abhängigkeiten zu den Azure Service Bus- und Azure Identity-Paketen hinzuzufügen.
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-servicebus</artifactId>
<version>7.13.3</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.8.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
Hinzufügen von Code für das Senden von Nachrichten an die Warteschlange
Fügen Sie die folgenden
import
-Anweisungen für das Thema der Java-Datei hinzu.import com.azure.messaging.servicebus.*; import com.azure.identity.*; import java.util.concurrent.TimeUnit; import java.util.Arrays; import java.util.List;
Definieren Sie in der Klasse Variablen für die Verbindungszeichenfolge und den Warteschlangennamen.
static String queueName = "<QUEUE NAME>";
Wichtig
Ersetzen Sie
<QUEUE NAME>
durch den Namen der Warteschlange.Fügen Sie in der Klasse eine Methode mit dem Namen
sendMessage
zum Senden einer Nachricht an die Warteschlange hinzu.Wichtig
Ersetzen Sie
NAMESPACENAME
durch den Namen Ihres Service Bus-Namespace.static void sendMessage() { // create a token using the default Azure credential DefaultAzureCredential credential = new DefaultAzureCredentialBuilder() .build(); ServiceBusSenderClient senderClient = new ServiceBusClientBuilder() .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net") .credential(credential) .sender() .queueName(queueName) .buildClient(); // send one message to the queue senderClient.sendMessage(new ServiceBusMessage("Hello, World!")); System.out.println("Sent a single message to the queue: " + queueName); }
Fügen Sie in der Klasse eine Methode mit dem Namen
createMessages
zum Erstellen einer Liste mit Nachrichten hinzu. Normalerweise erhalten Sie diese Nachrichten von den verschiedenen Teilen Ihrer Anwendung. Hier erstellen wir eine Liste mit Beispielnachrichten.static List<ServiceBusMessage> createMessages() { // create a list of messages and return it to the caller ServiceBusMessage[] messages = { new ServiceBusMessage("First message"), new ServiceBusMessage("Second message"), new ServiceBusMessage("Third message") }; return Arrays.asList(messages); }
Fügen Sie eine Methode mit dem Namen
sendMessageBatch
zum Senden von Nachrichten an die von Ihnen erstellte Warteschlange hinzu. Mit dieser Methode wird einServiceBusSenderClient
für die Warteschlange erstellt, diecreateMessages
-Methode zum Abrufen der Liste mit den Nachrichten aufgerufen und mindestens ein Batch vorbereitet. Anschließend werden die Batches an die Warteschlange gesendet.Wichtig
Ersetzen Sie
NAMESPACENAME
durch den Namen Ihres Service Bus-Namespace.static void sendMessageBatch() { // create a token using the default Azure credential DefaultAzureCredential credential = new DefaultAzureCredentialBuilder() .build(); ServiceBusSenderClient senderClient = new ServiceBusClientBuilder() .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net") .credential(credential) .sender() .queueName(queueName) .buildClient(); // Creates an ServiceBusMessageBatch where the ServiceBus. ServiceBusMessageBatch messageBatch = senderClient.createMessageBatch(); // create a list of messages List<ServiceBusMessage> listOfMessages = createMessages(); // We try to add as many messages as a batch can fit based on the maximum size and send to Service Bus when // the batch can hold no more messages. Create a new batch for next set of messages and repeat until all // messages are sent. for (ServiceBusMessage message : listOfMessages) { if (messageBatch.tryAddMessage(message)) { continue; } // The batch is full, so we create a new batch and send the batch. senderClient.sendMessages(messageBatch); System.out.println("Sent a batch of messages to the queue: " + queueName); // create a new batch messageBatch = senderClient.createMessageBatch(); // Add that message that we couldn't before. if (!messageBatch.tryAddMessage(message)) { System.err.printf("Message is too large for an empty batch. Skipping. Max size: %s.", messageBatch.getMaxSizeInBytes()); } } if (messageBatch.getCount() > 0) { senderClient.sendMessages(messageBatch); System.out.println("Sent a batch of messages to the queue: " + queueName); } //close the client senderClient.close(); }
Empfangen von Nachrichten aus einer Warteschlange
In diesem Abschnitt fügen Sie Code hinzu, mit dem Nachrichten aus der Warteschlange abgerufen werden.
Fügen Sie eine Methode mit dem Namen
receiveMessages
hinzu, um Nachrichten von der Warteschlange zu empfangen. Mit dieser Methode wird einServiceBusProcessorClient
-Element für die Warteschlange erstellt, indem ein Handler für die Verarbeitung von Nachrichten und ein anderer für die Verarbeitung von Fehlern angegeben wird. Anschließend wird der Prozessor gestartet, und es wird einige Sekunden lang abgewartet. Die empfangenen Nachrichten werden ausgegeben, und dann wird der Prozessor angehalten und geschlossen.Wichtig
- Ersetzen Sie
NAMESPACENAME
durch den Namen Ihres Service Bus-Namespace. - Ersetzen Sie
QueueTest
inQueueTest::processMessage
im Code durch den Namen Ihrer Klasse.
// handles received messages static void receiveMessages() throws InterruptedException { DefaultAzureCredential credential = new DefaultAzureCredentialBuilder() .build(); ServiceBusProcessorClient processorClient = new ServiceBusClientBuilder() .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net") .credential(credential) .processor() .queueName(queueName) .processMessage(context -> processMessage(context)) .processError(context -> processError(context)) .buildProcessorClient(); System.out.println("Starting the processor"); processorClient.start(); TimeUnit.SECONDS.sleep(10); System.out.println("Stopping and closing the processor"); processorClient.close(); }
- Ersetzen Sie
Fügen Sie die Methode
processMessage
hinzu, um eine Nachricht zu verarbeiten, die aus dem Service Bus-Abonnement empfangen wurde.private static void processMessage(ServiceBusReceivedMessageContext context) { ServiceBusReceivedMessage message = context.getMessage(); System.out.printf("Processing message. Session: %s, Sequence #: %s. Contents: %s%n", message.getMessageId(), message.getSequenceNumber(), message.getBody()); }
Fügen Sie die Methode
processError
zum Behandeln von Fehlermeldungen hinzu.private static void processError(ServiceBusErrorContext context) { System.out.printf("Error when receiving messages from namespace: '%s'. Entity: '%s'%n", context.getFullyQualifiedNamespace(), context.getEntityPath()); if (!(context.getException() instanceof ServiceBusException)) { System.out.printf("Non-ServiceBusException occurred: %s%n", context.getException()); return; } ServiceBusException exception = (ServiceBusException) context.getException(); ServiceBusFailureReason reason = exception.getReason(); if (reason == ServiceBusFailureReason.MESSAGING_ENTITY_DISABLED || reason == ServiceBusFailureReason.MESSAGING_ENTITY_NOT_FOUND || reason == ServiceBusFailureReason.UNAUTHORIZED) { System.out.printf("An unrecoverable error occurred. Stopping processing with reason %s: %s%n", reason, exception.getMessage()); } else if (reason == ServiceBusFailureReason.MESSAGE_LOCK_LOST) { System.out.printf("Message lock lost for message: %s%n", context.getException()); } else if (reason == ServiceBusFailureReason.SERVICE_BUSY) { try { // Choosing an arbitrary amount of time to wait until trying again. TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { System.err.println("Unable to sleep for period of time"); } } else { System.out.printf("Error source %s, reason %s, message: %s%n", context.getErrorSource(), reason, context.getException()); } }
Aktualisieren Sie die
main
-Methode, um die MethodensendMessage
,sendMessageBatch
undreceiveMessages
aufzurufen undInterruptedException
auszulösen.public static void main(String[] args) throws InterruptedException { sendMessage(); sendMessageBatch(); receiveMessages(); }
Ausführen der App
Wenn Sie Eclipse verwenden, klicken Sie mit der rechten Maustaste auf das Projekt, wählen Sie Export aus, erweitern Sie Java, wählen Sie Ausführbare JAR-Datei aus, und führen Sie diese Schritte aus, um eine ausführbare JAR-Datei zu erstellen.
Wenn Sie beim Computer mit einem anderen Benutzerkonto als dem zur Rolle Azure Service Bus-Datenbesitzer hinzugefügten angemeldet sind, führen Sie diese Schritte aus. Andernfalls überspringen Sie diesen Schritt und fahren mit der Ausführung der JAR-Datei im nächsten Schritt fort.
Installieren Sie die Azure CLI auf Ihrem Computer.
Führen Sie den folgenden CLI-Befehl aus, um sich bei Azure anzumelden. Verwenden Sie das Benutzerkonto, das Sie zur Rolle Azure Service Bus-Datenbesitzer hinzugefügt haben.
az login
Führen Sie die JAR-Datei mit dem folgenden Befehl aus.
java -jar <JAR FILE NAME>
Im Konsolenfenster wird die folgende Aus angezeigt:
Sent a single message to the queue: myqueue Sent a batch of messages to the queue: myqueue Starting the processor Processing message. Session: 88d961dd801f449e9c3e0f8a5393a527, Sequence #: 1. Contents: Hello, World! Processing message. Session: e90c8d9039ce403bbe1d0ec7038033a0, Sequence #: 2. Contents: First message Processing message. Session: 311a216a560c47d184f9831984e6ac1d, Sequence #: 3. Contents: Second message Processing message. Session: f9a871be07414baf9505f2c3d466c4ab, Sequence #: 4. Contents: Third message Stopping and closing the processor
Auf der Seite Übersicht für den Service Bus-Namespace im Azure-Portal wird die Anzahl eingehender und ausgehender Nachrichten angezeigt. Warten Sie etwa eine Minute lang, und aktualisieren Sie die Seite dann, damit die neuesten Werte angezeigt werden.
Wählen Sie auf der Seite Übersicht die Warteschlange aus, um zur Seite Service Bus-Warteschlange zu navigieren. Auf dieser Seite wird auch die Anzahl eingehender und ausgehender Nachrichten angezeigt. Darüber hinaus werden noch weitere Informationen wie etwa die aktuelle Größe der Warteschlange, die maximale Größe und die Anzahl aktiver Nachrichten angezeigt.
Nächste Schritte
Weitere Informationen finden Sie in der folgenden Dokumentation bzw. unter den folgenden Beispielen: