Écriture de code permettant d’envoyer et de recevoir des messages à l’aide d’une rubrique

Effectué

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 filtre FalseFilter 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 retournent True 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);