Cvičení – odesílání a příjem zpráv pomocí tématu
Rozhodli jste se použít téma služby Azure Service Bus k distribuci zpráv o výkonu prodeje ve vaší aplikaci Salesforce. Pracovníci prodeje použijí aplikaci na svých mobilních zařízeních k odesílání zpráv, které shrnují údaje o prodeji pro každou oblast a časové období. Tyto zprávy se distribuují do webových služeb, které se nacházejí v provozních oblastech společnosti, včetně Ameriky a Evropy.
Už jste implementovali potřebnou infrastrukturu ve svých předplatných Azure pro dané téma. Teď chcete napsat kód, který odesílá zprávy do tématu, a psát kód, který načítá zprávy z odběru. Pak odešlete zprávu do tématu a načtete zprávu pro konkrétní odběr.
Spuštěním následujících příkazů v Azure Cloud Shellu se ujistěte, že pracujete ve správném adresáři:
cd ~/mslearn-connect-services-together/implement-message-workflows-with-service-bus/src/start
code .
Napsání kódu pro odeslání zprávy do tématu
Pokud chcete dokončit komponentu, která odesílá zprávy o prodejním výkonu, proveďte tyto kroky:
V editoru Azure Cloud Shell otevřete performancemessagesender/Program.cs a najděte následující řádek kódu:
const string ServiceBusConnectionString = "";
Mezi uvozovky vložte připojovací řetězec, které jste uložili v předchozím cvičení.
Pokud jste pro název fronty použili jiný název než salesperformancemessages , aktualizujte hodnotu vlastnosti
TopicName
v kódu:const string TopicName = "salesperformancemessages";
Vyhledejte metodu
SendPerformanceMessageAsync()
. (Tip: Je na řádku 26 nebo v blízkosti.) V této metodě vyhledejte následující řádek kódu:// Create a Service Bus client here
Nahraďte tento řádek kódu tímto kódem:
// By leveraging "await using", the DisposeAsync method will be called automatically when the client variable goes out of scope. // In more realistic scenarios, you would store off a class reference to the client (rather than to a local variable) so that it can be used throughout your program. await using var client = new ServiceBusClient(ServiceBusConnectionString);
SendPerformanceMessageAsync()
V metodě vyhledejte následující řádek kódu:// Create a sender here
Nahraďte tento řádek kódu tímto kódem:
await using ServiceBusSender sender = client.CreateSender(TopicName);
try...catch
V bloku najděte následující řádek kódu:// Create and send a message here
Nahraďte tento řádek kódu tímto kódem:
string messageBody = "Total sales for Brazil in August: $13m."; var message = new ServiceBusMessage(messageBody);
Pokud chcete zobrazit zprávu v konzole, vložte na další řádek následující kód:
Console.WriteLine($"Sending message: {messageBody}");
Pokud chcete odeslat zprávu do tématu, vložte na další řádek následující kód:
await sender.SendMessageAsync(message);
Zkontrolujte, že konečný kód vypadá podobně jako v následujícím příkladu:
using System; using System.Threading.Tasks; using Azure.Messaging.ServiceBus; namespace performancemessagesender { class Program { const string ServiceBusConnectionString = "Endpoint=sb://example.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxx"; const string TopicName = "salesperformancemessages"; static void Main(string[] args) { Console.WriteLine("Sending a message to the Sales Performance topic..."); SendPerformanceMessageAsync().GetAwaiter().GetResult(); Console.WriteLine("Message was sent successfully."); } static async Task SendPerformanceMessageAsync() { // By leveraging "await using", the DisposeAsync method will be called automatically once the client variable goes out of scope. // In more realistic scenarios, you would store off a class reference to the client (rather than to a local variable) so that it can be used throughout your program. await using var client = new ServiceBusClient(ServiceBusConnectionString); await using ServiceBusSender sender = client.CreateSender(TopicName); try { string messageBody = "Total sales for Brazil in August: $13m."; var message = new ServiceBusMessage(messageBody); Console.WriteLine($"Sending message: {messageBody}"); await sender.SendMessageAsync(message); } catch (Exception exception) { Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}"); } } } }
Stisknutím Ctrl+S uložte změny a stisknutím Ctrl+Q zavřete editor.
Odeslání zprávy do tématu
Pokud chcete spustit komponentu, která odesílá zprávu o prodeji, spusťte v Cloud Shellu následující příkaz:
dotnet run --project performancemessagesender
Při spuštění programu sledujte oznámení v Cloud Shellu, která indikují, že se odesílá zpráva. Pokaždé, když aplikaci spustíte, přidá se do tématu další zpráva a pro každé předplatné se zpřístupní kopie.
Sending a message to the Sales Performance topic... Sending message: Total sales for Brazil in August: $13m. Message was sent successfully.
Před načtením zpráv pro odběr zkontrolujte počet zpráv.
Až se zobrazí Message was sent successfully
, spusťte následující příkaz, abyste viděli, kolik zpráv je v předplatném Americas
. Nezapomeňte nahradit <název> oboru názvů vaším oborem názvů služby Service Bus.
az servicebus topic subscription show \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--topic-name salesperformancemessages \
--name Americas \
--query messageCount \
--namespace-name <namespace-name>
Pokud příkaz nahradíte Americas
EuropeAndAsia
a spustíte ho znovu, uvidíte, že obě odběry mají stejný počet zpráv.
Napsání kódu pro načtení zprávy tématu pro odběr
Pokud chcete vytvořit komponentu, která načítá zprávy o prodejním výkonu, proveďte následující kroky:
Spuštěním spusťte
code .
editor.V editoru otevřete performancemessagereceiver/Program.cs a najděte následující řádek kódu:
const string ServiceBusConnectionString = "";
Mezi uvozovky vložte připojovací řetězec, které jste uložili v předchozím cvičení.
Pokud chcete vytvořit klienta služby Service Bus, vyhledejte metodu
MainAsync()
. V této metodě najděte následující řádek kódu:// Create a Service Bus client that will authenticate using a connection string
Nahraďte daný řádek tímto kódem:
var client = new ServiceBusClient(ServiceBusConnectionString);
Pokud chcete nakonfigurovat možnosti zpracování zpráv, vyhledejte následující řádek kódu:
// Create the options to use for configuring the processor
Nahraďte daný řádek tímto kódem:
var processorOptions = new ServiceBusProcessorOptions { MaxConcurrentCalls = 1, AutoCompleteMessages = false };
Pokud chcete vytvořit procesor, najděte následující řádek kódu:
// Create a processor that we can use to process the messages
Nahraďte daný řádek tímto kódem:
ServiceBusProcessor processor = client.CreateProcessor(TopicName, SubscriptionName, processorOptions);
Pokud chcete nakonfigurovat obslužnou rutinu, vyhledejte následující řádek kódu:
// Configure the message and error handler to use
Nahraďte daný řádek tímto kódem:
processor.ProcessMessageAsync += MessageHandler; processor.ProcessErrorAsync += ErrorHandler;
Chcete-li zahájit zpracování, vyhledejte následující řádek kódu:
// Start processing
Nahraďte daný řádek tímto kódem:
await processor.StartProcessingAsync();
Vyhledejte následující řádek kódu:
// Since we didn't use the "await using" syntax here, we need to explicitly dispose the processor and client
Řádek nahraďte tímto kódem:
await processor.DisposeAsync(); await client.DisposeAsync();
Chcete-li zobrazit příchozí zprávy v konzole, vyhledejte metodu
MessageHandler()
. Tuto metodu jste zaregistrovali pro zpracování příchozích zpráv.Nahraďte veškerý kód v rámci této metody následujícím kódem:
Console.WriteLine($"Received message: SequenceNumber:{args.Message.SequenceNumber} Body:{args.Message.Body}");
Chcete-li odebrat přijatou zprávu z odběru, na další řádek přidejte následující kód:
await args.CompleteMessageAsync(args.Message);
Zkontrolujte, že konečný kód vypadá podobně jako v následujícím příkladu:
using System; using System.Text; using System.Threading; using System.Threading.Tasks; using Azure.Messaging.ServiceBus; namespace performancemessagereceiver { class Program { const string ServiceBusConnectionString = "Endpoint=sb://alexgeddyneil.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxx"; const string TopicName = "salesperformancemessages"; const string SubscriptionName = "Americas"; static void Main(string[] args) { MainAsync().GetAwaiter().GetResult(); } static async Task MainAsync() { var client = new ServiceBusClient(ServiceBusConnectionString); Console.WriteLine("======================================================"); Console.WriteLine("Press ENTER key to exit after receiving all the messages."); Console.WriteLine("======================================================"); var processorOptions = new ServiceBusProcessorOptions { MaxConcurrentCalls = 1, AutoCompleteMessages = false }; ServiceBusProcessor processor = client.CreateProcessor(TopicName, SubscriptionName, processorOptions); processor.ProcessMessageAsync += MessageHandler; processor.ProcessErrorAsync += ErrorHandler; await processor.StartProcessingAsync(); Console.Read(); await processor.DisposeAsync(); await client.DisposeAsync(); } static async Task MessageHandler(ProcessMessageEventArgs args) { Console.WriteLine($"Received message: SequenceNumber:{args.Message.SequenceNumber} Body:{args.Message.Body}"); await args.CompleteMessageAsync(args.Message); } static Task ErrorHandler(ProcessErrorEventArgs args) { Console.WriteLine($"Message handler encountered an exception {args.Exception}."); Console.WriteLine("Exception context for troubleshooting:"); Console.WriteLine($"- Endpoint: {args.FullyQualifiedNamespace}"); Console.WriteLine($"- Entity Path: {args.EntityPath}"); Console.WriteLine($"- Executing Action: {args.ErrorSource}"); return Task.CompletedTask; } } }
Stisknutím Ctrl+S uložte změny a stisknutím Ctrl+Q zavřete editor.
Načtení zprávy tématu pro odběr
Pokud chcete spustit komponentu, která načte zprávu o prodejním výkonu předplatného, spusťte následující příkaz:
dotnet run --project performancemessagereceiver
Zobrazí se výstup podobný následujícímu příkladu:
Received message: SequenceNumber:1 Body:Total sales for Brazil in August: $13m.
Když program vrátí oznámení o příjmu zpráv, stisknutím klávesy Enter aplikaci zastavte.
Kontrola počtu zpráv po načtení zprávy pro odběr
Spuštěním následujícího příkazu potvrďte, že v předplatném Americas
nejsou žádné zbývající zprávy. Nezapomeňte nahradit <název> oboru názvů vaším oborem názvů služby Service Bus.
az servicebus topic subscription show \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--topic-name salesperformancemessages \
--name Americas \
--query messageCount \
--namespace-name <namespace-name>
Pokud nahradíte Americas
tímto kódem EuropeAndAsia
aktuální počet zpráv pro EuropeAndAsia
odběr, uvidíte, že počet zpráv je 1
. V předchozím kódu byl nastaven pouze Americas
na načtení zpráv tématu, takže zpráva stále čeká na EuropeAndAsia
načtení.