Code schrijven om berichten te verzenden en te ontvangen met behulp van een onderwerp

Voltooid

In een gedistribueerde toepassing moeten sommige berichten naar één ontvanger worden verstuurd. Andere berichten moeten naar meer dan een bestemming worden verstuurd.

Bedenk wat er gebeurt wanneer een gebruiker een fietsorder annuleert. Het annuleren van een bestelling is iets anders dan het plaatsen van een initiële bestelling. Wanneer een bestelling wordt geplaatst, wachtte de werkstroom totdat de order de betaling heeft gewist voordat de bestelling naar de lokale winkel wordt verzonden. Voor de annuleringsbewerking stelt u de winkel en de betalingsverwerker op hetzelfde moment op de hoogte. Deze aanpak minimaliseert de kans op het verspillen van de bezorgertijd.

Als u wilt toestaan dat meerdere onderdelen hetzelfde bericht ontvangen, gebruikt u een Azure Service Bus-onderwerp. Vervolgens bekijkt u het proces en de overwegingen bij het schrijven van de code.

Code met onderwerpen versus code met wachtrijen

Als u wilt dat elk bericht dat wordt verzonden, wordt bezorgd bij alle abonnerende onderdelen, gebruikt u onderwerpen. Het schrijven van code die gebruikmaakt van onderwerpen is een manier om wachtrijen te vervangen. U gebruikt hetzelfde Azure.Messaging.ServiceBus NuGet-pakket, configureert verbindingsreeks s en gebruikt asynchrone programmeerpatronen.

U gebruikt ook dezelfde ServiceBusClient klasse en ServiceBusSender klassen om berichten en de ServiceBusProcessor klasse te verzenden om berichten te ontvangen.

Filters instellen voor abonnementen

Als u specifieke berichten wilt ontvangen die naar het onderwerp worden verzonden naar een specifiek abonnement, kunt u een of meer filters voor het abonnement in het onderwerp plaatsen. In de fietstoepassing worden bijvoorbeeld uw webwinkels uitgevoerd Universeel Windows-platform (UWP)-toepassingen. Elke winkel kan zich abonneren op het OrderCancellation onderwerp en filteren op een eigen StoreIdarchief. U bespaart internetbandbreedte omdat u geen onnodige berichten naar meerdere winkellocaties verzendt. Ondertussen abonneert het onderdeel betalingsverwerking zich op alle OrderCancellation berichten.

Er zijn drie typen filters:

  • Booleaanse filters: Hiermee TrueFilter zorgt u ervoor dat alle berichten die naar het onderwerp worden verzonden, worden bezorgd bij het huidige abonnement. De FalseFilter zorgt ervoor dat geen van de berichten aan het huidige abonnement worden geleverd. (Hierdoor wordt het abonnement in feite vergrendeld of uitgeschakeld.)
  • SQL-filters: Een SQL-filter geeft een voorwaarde op met behulp van dezelfde syntaxis als een WHERE component in een SQL-query. Alleen berichten die worden geretourneerd True wanneer ze worden geëvalueerd op basis van dit filter, worden aan de abonnees geleverd.
  • Correlatiefilters: een correlatiefilter bevat een set voorwaarden die overeenkomen met de eigenschappen van elk bericht. Als de eigenschap in het filter en de eigenschap in het bericht dezelfde waarde hebben, wordt deze beschouwd als een overeenkomst.

Voor uw StoreId filter kunt u een SQL-filter gebruiken. SQL-filters zijn het meest flexibel, maar zijn ook de duurste rekenkracht en het filter kan uw Service Bus-doorvoer vertragen. In dit geval kiest u een correlatiefilter.

Een bericht verzenden naar een onderwerp

Als u een bericht naar een onderwerp wilt verzenden, voert u de volgende stappen uit.

Voeg in een verzendend of ontvangend onderdeel de volgende using instructies toe aan een codebestand dat een Service Bus-onderwerp aanroept.

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

Als u een bericht wilt verzenden, maakt u eerst een nieuw ServiceBusClient object en geeft u het door aan de verbindingsreeks en de naam van het onderwerp.

await using var client = new ServiceBusClient(connectionString);

Maak vervolgens een ServiceBusSender object door de CreateSender methode voor het ServiceBusClient object aan te roepen en de onderwerpnaam op te geven.

ServiceBusSender sender = client.CreateSender(topicName);

U kunt een bericht naar het onderwerp verzenden door de ServiceBusSender.SendMessageAsync() methode aan te roepen en een ServiceBusMessage. Net als in een wachtrij moet het bericht de vorm hebben van een UTF-8-gecodeerde tekenreeks.

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

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

Berichten ontvangen van een abonnement

Als u een bericht van een abonnement wilt ontvangen, moet u een ServiceBusProcessor object maken en deze doorgeven aan de onderwerpnaam en de abonnementsnaam.

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

Registreer vervolgens een berichthandler en een fouthandler.

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

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

Voer uw verwerking uit binnen de berichtenhandler en roep vervolgens de ProcessMessageEventArgs.CompleteMessageAsync() methode aan om het bericht uit het abonnement te verwijderen.

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