Écriture de code permettant d’envoyer et de recevoir des messages à l’aide d’une rubrique
Dans une application distribuée, certains messages doivent être envoyés à un seul composant destinataire. D’autres messages doivent atteindre plus d’une destination.
Voyons ce qui se passe quand un utilisateur annule une commande de vélo. Annuler une commande ne fonctionne pas exactement de la même manière que passer une commande initiale. Lorsque la commande a été passée, le workflow a attendu que le traitement du paiement soit effectué avant d’envoyer la commande à la boutique locale. Dans le cas de l’opération d’annulation, vous allez notifier en même temps la boutique et l’entreprise de traitement des paiements. Cette approche permet de limiter les risques de faire perdre du temps au livreur.
Pour que plusieurs composants puissent recevoir le même message, nous allons utiliser la rubrique Azure Service Bus. Vous examinerez ensuite le processus et les points à prendre en compte pour écrire du code.
Code avec rubriques et code avec files d’attente
Si vous voulez que tous les messages envoyés soient remis à tous les composants abonnés, utilisez des rubriques. L’écriture de code qui utilise des rubriques est une manière de remplacer des files d’attente. Vous allez utiliser le même package NuGet Azure.Messaging.ServiceBus, configurer les chaînes de connexion et utiliser des modèles de programmation asynchrones.
Vous utiliserez également la classe ServiceBusClient
et les classes ServiceBusSender
pour envoyer des messages, ainsi que la classe ServiceBusProcessor
pour en recevoir.
Définir des filtres sur les abonnements
Si vous souhaitez que certains messages envoyés à la rubrique soient remis à un abonnement en particulier, vous pouvez placer un ou plusieurs filtres sur l’abonnement dans la rubrique. Dans l’exemple d’application de vente de vélos, vos boutiques exécutent des applications UWP (Universal Windows Platform, plateforme Windows universelle). Chaque magasin peut s’abonner à la rubrique OrderCancellation
et filtrer les résultats sur son propre StoreId
. Vous économisez de la bande passante Internet, car vous n’envoyez pas de messages non nécessaires à plusieurs emplacements de magasin. Pendant ce temps, le composant de traitement du paiement s’abonne à tous les messages OrderCancellation
.
Les filtres peuvent être de trois types :
- Filtres booléens : Le filtre
TrueFilter
garantit que tous les messages envoyés à la rubrique sont transmis à l’abonnement actuel. Le filtreFalseFilter
garantit qu’aucun des messages n’est transmis à l’abonnement actuel. (Ceci bloque ou fait basculer efficacement l’abonnement.) - Filtres SQL : Un filtre SQL spécifie une condition en utilisant la même syntaxe qu’une clause
WHERE
dans une requête SQL. Seuls les messages qui retournentTrue
quand ils sont évalués par rapport à ce filtre sont remis aux abonnés. - Filtres de corrélation : Un filtre de corrélation possède un ensemble de conditions qui correspondent aux propriétés de chaque message. Il y a correspondance si la propriété indiquée dans le filtre et la propriété du message possèdent les mêmes valeurs.
Pour votre filtre StoreId
, vous pourriez utiliser un filtre SQL. Ce sont les plus flexibles, mais aussi les plus coûteux en matière de ressources. Un tel filtre pourrait donc limiter votre débit Service Bus, auquel cas vous choisirez un filtre de corrélation.
Envoi d’un message à une rubrique
Procédez comme suit pour envoyer un message à une rubrique.
Dans n’importe quel composant d’envoi ou de réception, ajoutez les instructions using
suivantes à tous les fichiers de code qui appellent une rubrique Service Bus.
using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;
Pour envoyer un message, commencez par créer un objet ServiceBusClient
et lui envoyer la chaîne de connexion et le nom de la rubrique.
await using var client = new ServiceBusClient(connectionString);
Créez ensuite un objet ServiceBusSender
en appelant la méthode CreateSender
sur l’objet ServiceBusClient
et en spécifiant le nom de la rubrique.
ServiceBusSender sender = client.CreateSender(topicName);
Pour envoyer un message à la rubrique, appelez la méthode ServiceBusSender.SendMessageAsync()
et passez un ServiceBusMessage
. Comme pour les files d’attente, le message doit se présenter sous la forme d’une chaîne encodée en UTF-8.
string message = "Cancel! I have changed my mind!";
var message = new ServiceBusMessage(message);
// Send the message to the topic.
await sender.SendMessageAsync(message);
Réception de messages provenant d’un abonnement
Pour recevoir un message d’un abonnement, vous devez créer un objet ServiceBusProcessor
et lui passer le nom de la rubrique et de l’abonnement.
processor = client.CreateProcessor(topicName, subscriptionName, options);
Ensuite, inscrivez un gestionnaire de messages et un gestionnaire d’erreurs.
// Specify the handler method for messages.
processor.ProcessMessageAsync += MessageHandler;
// Specify the handler method for errors.
processor.ProcessErrorAsync += ErrorHandler;
Effectuez votre traitement dans le gestionnaire de messages, puis appelez la méthode ProcessMessageEventArgs.CompleteMessageAsync()
pour supprimer le message de l’abonnement.
// Complete the message. The message is deleted from the subscription.
await args.CompleteMessageAsync(args.Message);