Skriva kod för att skicka och ta emot meddelanden med hjälp av ett ämne

Slutförd

I ett distribuerat program måste meddelanden skickas till en enda mottagarkomponent. Andra meddelanden måste nå fler än ett mål.

Tänk på vad som händer när en användare avbryter en cykelbeställning. Att avbryta en beställning skiljer sig lite från att göra en första beställning. När en beställning görs väntade arbetsflödet tills beställningen rensade betalningsbearbetningen innan beställningen skickades till den lokala butiken. För åtgärden Avbryt meddelar du butiken och betalningsprocessorn samtidigt. Den här metoden minimerar risken för slöseri med leveransförartid.

Om du vill tillåta att flera komponenter får samma meddelande använder du ett Azure Service Bus-ämne. Därefter tittar du på processen och övervägandena när du skriver koden.

Kod med ämnen jämfört med kod med köer

Om du vill att alla meddelanden som skickas ska levereras till alla prenumererande komponenter använder du ämnen. Att skriva kod som använder ämnen är ett sätt att ersätta köer. Du använder samma Azure.Messaging.ServiceBus NuGet-paket, konfigurera anslutningssträngar och använda asynkrona programmeringsmönster.

Du använder också samma ServiceBusClient klass och ServiceBusSender klasser för att skicka meddelanden och klassen ServiceBusProcessor för att ta emot meddelanden.

Ange filter för prenumerationer

Om du vill att specifika meddelanden som skickas till ämnet ska levereras till en specifik prenumeration kan du placera ett eller flera filter på prenumerationen i ämnet. I cykelprogrammet kör till exempel dina butiker Universell Windows-plattform (UWP) program. Varje butik kan prenumerera på ämnet OrderCancellation och filtrera efter sin egen StoreId. Du sparar internetbandbredd eftersom du inte skickar onödiga meddelanden till flera butiksplatser. Under tiden prenumererar betalningsbearbetningskomponenten på alla OrderCancellation meddelanden.

Filter kan vara någon av följande tre typer:

  • Booleska filter: TrueFilter Säkerställer att alla meddelanden som skickas till ämnet levereras till den aktuella prenumerationen. FalseFilter ser till att inga meddelanden skickas till den aktuella prenumerationen. (Detta blockerar eller stänger av prenumerationen.)
  • SQL-filter: Ett SQL-filter anger ett villkor med samma syntax som en WHERE sats i en SQL-fråga. Endast meddelanden som returneras True när de utvärderas mot det här filtret levereras till prenumeranterna.
  • Korrelationsfilter: Ett korrelationsfilter innehåller en uppsättning villkor som matchas mot egenskaperna för varje meddelande. Om egenskapen i filtret och egenskapen i meddelandet har samma värde betraktas den som en matchning.

StoreId För filtret kan du använda ett SQL-filter. SQL-filter är de mest flexibla, men de är också de mest beräkningsmässigt dyra, och filtret kan göra Service Bus-dataflödet långsammare. I det här fallet väljer du ett korrelationsfilter.

Skicka ett meddelande till ett ämne

Om du vill skicka ett meddelande till ett ämne slutför du följande steg.

Lägg till följande using instruktioner i en kodfil som anropar ett Service Bus-ämne i valfri komponent som skickar eller tar emot.

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

Om du vill skicka ett meddelande börjar du med att skapa ett nytt ServiceBusClient objekt och skickar det anslutningssträng och namnet på ämnet.

await using var client = new ServiceBusClient(connectionString);

Skapa sedan ett ServiceBusSender objekt genom att CreateSender anropa -metoden på ServiceBusClient objektet och ange ämnesnamnet.

ServiceBusSender sender = client.CreateSender(topicName);

Du kan skicka ett meddelande till ämnet genom att anropa ServiceBusSender.SendMessageAsync() metoden och skicka en ServiceBusMessage. Precis som i en kö måste meddelandet vara i form av en UTF-8-kodad sträng.

string message = "Cancel! I have changed my mind!";
var message = new ServiceBusMessage(message);

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

Ta emot meddelanden från en prenumeration

Om du vill ta emot ett meddelande från en prenumeration måste du skapa ett ServiceBusProcessor objekt och skicka det ämnesnamnet och prenumerationsnamnet.

processor = client.CreateProcessor(topicName, subscriptionName, options);

Registrera sedan en meddelandehanterare och en felhanterare.

// Specify the handler method for messages.
processor.ProcessMessageAsync += MessageHandler;

// Specify the handler method for errors.
processor.ProcessErrorAsync += ErrorHandler;

Utför bearbetningen i meddelandehanteraren och anropa ProcessMessageEventArgs.CompleteMessageAsync() sedan metoden för att ta bort meddelandet från prenumerationen.

// Complete the message. The message is deleted from the subscription. 
await args.CompleteMessageAsync(args.Message);