Schreiben von Code zum Senden und Empfangen von Nachrichten mithilfe einer Warteschlange

Abgeschlossen

Verteilte Anwendungen arbeiten mit Service Bus-Warteschlangen als temporäre Speicherorte für Nachrichten, die auf die Zustellung an eine Zielkomponente warten. Schreiben Sie sowohl in der Quell- als auch in der Zielkomponente Code, um Nachrichten über eine Warteschlange zu senden und zu empfangen.

Betrachten Sie die Contoso Bicycles-Anwendung. Der Kunde kann eine Bestellung über eine Website oder mobile App aufgeben. Da Websites und mobile Apps auf Kundengeräten ausgeführt werden, gibt es eigentlich keine Obergrenze dafür, wie viele Bestellungen gleichzeitig aufgegeben werden können. Wenn die mobile App und die Website die Bestellungen in einer Service Bus-Warteschlange ablegen, kann die Back-End-Komponente (eine Web-App) Aufträge aus dieser Warteschlange in ihrem eigenen Tempo verarbeiten.

In der Contoso Bicycles-Anwendung gibt es mehrere Schritte, um eine neue Bestellung zu verarbeiten. Alle Schritte hängen davon ab, dass die Zahlung zuerst autorisiert wird, weshalb Sie sich für eine Warteschlange entscheiden. Die erste Aufgabe der empfangenden Komponente ist die Verarbeitung der Zahlung.

In der mobilen App und auf der Website muss Contoso Code schreiben, mit dem der Warteschlange eine Nachricht hinzugefügt wird. In der Back-End-Web-App wird von Contoso Code geschrieben, mit dem Nachrichten in der Warteschlange ausgewählt werden.

Hier sehen Sie sich den Prozess und die Überlegungen beim Schreiben von Code zum Senden und Empfangen von Nachrichten mithilfe einer Service Bus-Warteschlange an.

NuGet-Paket Azure.Messaging.ServiceBus

Microsoft stellt eine Bibliothek mit .NET-Klassen bereit, um das Schreiben von Code zu vereinfachen, mit dem Nachrichten über Service Bus gesendet und empfangen werden. Sie können sie in jeder .NET-Sprache nutzen, um mit einer Warteschlange oder einem Thema von Service Bus zu interagieren. Diese Bibliothek können Sie in Ihre Anwendung einbinden, indem Sie das NuGet-Paket Azure.Messaging.ServiceBus hinzufügen.

Verbindungszeichenfolgen und Schlüssel

Sowohl für Quellkomponenten als auch für Zielkomponenten sind zwei Informationen erforderlich, um eine Verbindung mit einer Warteschlange in einem Service Bus-Namespace herzustellen:

  • Der Speicherort des Service Bus-Namespace, auch als Endpunkt bekannt: Der Speicherort wird als vollqualifizierter Domänenname in der Domäne servicebus.windows.net angegeben. Beispiel: bicycleService.servicebus.windows.net.
  • Ein Zugriffsschlüssel: Service Bus schränkt den Zugriff auf Warteschlangen oder Themen ein, indem ein gültiger Zugriffsschlüssel gefordert wird.

Diese beiden Informationen werden in Form einer Verbindungszeichenfolge für das Objekt ServiceBusClient bereitgestellt. Sie können die richtige Verbindungszeichenfolge für Ihren Namespace im Azure-Portal abrufen.

Asynchrones Aufrufen von Methoden

Die Warteschlange in Azure kann sich von den sendenden und empfangenden Komponenten Tausende Kilometer weit entfernt befinden. Auch wenn die physische Entfernung nicht groß ist, können langsame Verbindungen und Bandbreitenkonflikte zu Verzögerungen führen, wenn eine Komponente eine Methode in der Warteschlange aufruft. Aus diesem Grund werden über die Service Bus-Clientbibliothek async-Methoden für die Interaktion mit Warteschlangen bereitgestellt. Wir verwenden diese Methoden, um das Blockieren eines Threads zu vermeiden, während auf den Abschluss von Aufrufen gewartet wird.

Wenn Sie beispielsweise eine Nachricht an eine Warteschlange senden, verwenden Sie die SendMessageAsync-Methode mit dem Schlüsselwort await.

Senden einer Nachricht an eine Warteschlange

Um eine Nachricht an eine Warteschlange zu senden, führen Sie die folgenden Schritte aus.

Fügen Sie in allen Sende- oder Empfangskomponenten allen Codedateien, in denen eine Service Bus-Warteschlange aufgerufen wird, die folgenden using-Anweisungen hinzu.

using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;

Erstellen Sie als Nächstes ein neues ServiceBusClient-Objekt, und übergeben Sie diesem die Verbindungszeichenfolge und den Namen der Warteschlange.

// Create a ServiceBusClient object using the connection string to the namespace.
await using var client = new ServiceBusClient(connectionString);
    
// Create a ServiceBusSender object by invoking the CreateSender method on the ServiceBusClient object, and specifying the queue name. 
ServiceBusSender sender = client.CreateSender(queueName);

Sie können eine Nachricht an die Warteschlange senden, indem Sie die ServiceBusSender.SendMessageAsync()-Methode aufrufen und ServiceBusMessage übergeben.

// Create a new message to send to the queue.
string messageContent = "Order new crankshaft for eBike.";
var message = new ServiceBusMessage(messageContent);

// Send the message to the queue.
await sender.SendMessageAsync(message);

Empfangen von Nachrichten aus der Warteschlange

Um Nachrichten zu empfangen, müssen Sie zunächst einen Meldungshandler registrieren. Der Meldungshandler ist die Methode im Code, die aufgerufen wird, wenn eine Nachricht in der Warteschlange verfügbar ist.

// Create a ServiceBusProcessor for the queue.
await using ServiceBusProcessor processor = client.CreateProcessor(queueName, options);
    
// Specify handler methods for messages and errors.
processor.ProcessMessageAsync += MessageHandler;
processor.ProcessErrorAsync += ErrorHandler;

Führen Sie Ihre Verarbeitungsschritte aus. Rufen Sie dann im Nachrichtenhandler die ProcessMessageEventArgs.CompleteMessageAsync()-Methode auf, um die Nachricht aus der Warteschlange zu entfernen.

await args.CompleteMessageAsync(args.Message);