Psaní kódu pro odesílání a přijímání zpráv pomocí tématu
V distribuované aplikaci je potřeba některé zprávy odeslat jediné komponentě příjemce. Další zprávy budou muset dorazit do více než jednoho cíle.
Zvažte, co se stane, když uživatel zruší objednávku jízdních kol. Zrušení objednávky se trochu liší od umístění počáteční objednávky. Po zadání objednávky pracovní postup čekal před odesláním objednávky do místní výkladní skříně až do vymazání objednávky. U operace zrušení oznámíte výkladní skříň a zpracovatele plateb současně. Tento přístup minimalizuje riziko plýtvání časem řidiče doručení.
Pokud chcete povolit, aby stejnou zprávu obdrželo více komponent, použijete téma služby Azure Service Bus. V dalším kroku se podíváte na proces a aspekty psaní kódu.
Kód s tématy a kód s frontami
Pokud chcete, aby se všechny zprávy odesílané doručily všem součástem odběru, použijte témata. Psaní kódu, který využívá témata, je jedním ze způsobů, jak nahradit fronty. Použijete stejný balíček NuGet Azure.Messaging.ServiceBus, nakonfigurujete připojovací řetězec a použijete asynchronní programovací vzory.
Použijete také stejnou ServiceBusClient
třídu a ServiceBusSender
třídy k odesílání zpráv a ServiceBusProcessor
třídy pro příjem zpráv.
Nastavení filtrů u předplatných
Pokud chcete, aby se určité zprávy odesílané do tématu doručily do konkrétního předplatného, můžete do tématu umístit jeden nebo více filtrů. Například v aplikaci pro jízdní kola běží vaše výkladní skříně Univerzální platforma Windows aplikací pro UPW.< a1/>. Každý obchod se může přihlásit k odběru OrderCancellation
tématu a filtrovat si vlastní StoreId
. Šetříte šířku pásma internetu, protože neodesíláte nepotřebné zprávy do více umístění úložiště. Mezitím se komponenta pro zpracování plateb přihlásí k odběru všech OrderCancellation
zpráv.
Filtry můžou být jednoho ze tří typů:
- Logické filtry: Zajišťuje
TrueFilter
, aby se všechny zprávy odeslané do tématu doručily do aktuálního předplatného.FalseFilter
zajistí, že se žádné zprávy nedoručí do aktuálního odběru. (Ve skutečnosti se tím zablokuje nebo vypne odběr.) - Filtry SQL: Filtr SQL určuje podmínku pomocí stejné syntaxe jako
WHERE
klauzule v dotazu SQL. Odběratelům se doručí jenom zprávy, které se vrátíTrue
, když budou vyhodnoceny proti tomuto filtru. - Filtry korelace: Filtr korelace obsahuje sadu podmínek, které se shodují s vlastnostmi každé zprávy. Pokud vlastnost ve filtru a vlastnosti zprávy mají stejnou hodnotu, považuje se za shodu.
StoreId
Pro filtr můžete použít filtr SQL. Filtry SQL jsou nejflexibilnější, ale jsou také výpočetně nákladné a filtr může zpomalit propustnost služby Service Bus. V tomto případě zvolíte filtr korelace.
Odeslání zprávy do tématu
Pokud chcete odeslat zprávu do tématu, proveďte následující kroky.
V jakékoli odesílající nebo přijímající komponentě přidejte následující using
příkazy do libovolného souboru kódu, který volá téma služby Service Bus.
using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;
Pokud chcete odeslat zprávu, začněte vytvořením nového ServiceBusClient
objektu a předáním připojovací řetězec a názvu tématu.
await using var client = new ServiceBusClient(connectionString);
Pak vytvořte ServiceBusSender
objekt vyvoláním CreateSender
metody objektu ServiceBusClient
a zadáním názvu tématu.
ServiceBusSender sender = client.CreateSender(topicName);
Do tématu můžete odeslat zprávu voláním ServiceBusSender.SendMessageAsync()
metody a předáním ServiceBusMessage
. Stejně jako ve frontě musí být zpráva ve formě řetězce s kódováním 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);
Příjem zpráv z odběru
Pokud chcete dostávat zprávu z odběru, musíte vytvořit ServiceBusProcessor
objekt a předat mu název tématu a název odběru.
processor = client.CreateProcessor(topicName, subscriptionName, options);
Pak zaregistrujte obslužnou rutinu zprávy a obslužnou rutinu chyby.
// Specify the handler method for messages.
processor.ProcessMessageAsync += MessageHandler;
// Specify the handler method for errors.
processor.ProcessErrorAsync += ErrorHandler;
Proveďte zpracování v obslužné rutině zprávy a potom zavolejte ProcessMessageEventArgs.CompleteMessageAsync()
metodu, která odebere zprávu z odběru.
// Complete the message. The message is deleted from the subscription.
await args.CompleteMessageAsync(args.Message);