Cvičení – odesílání a příjem zpráv pomocí fronty
Rozhodli jste se použít frontu Service Bus ke zpracování zpráv o jednotlivých prodejích mezi mobilní aplikací, kterou používají vaši pracovníci prodeje, a webovou službou hostovaným v Azure, která ukládá podrobnosti o každém prodeji v instanci služby Azure SQL Database.
V předchozím cvičení jste implementovali potřebné objekty ve vašem předplatném Azure. Teď chcete napsat kód, který bude zprávy do této fronty odesílat a zase je z ní načítat.
V této lekci vytvoříte dvě konzolové aplikace: jedna aplikace umístí zprávy do fronty služby Service Bus a jedna aplikace načte zprávy z fronty služby Service Bus. Obě aplikace jsou součástí jednoho řešení .NET Core.
Klonování a otevření úvodní aplikace
Poznámka:
Pro zjednodušení vám následující úlohy pomůžou pevně zakódovat připojovací řetězec v Program.cs souboru obou konzolových aplikací. V produkční aplikaci byste měli použít ověřování řízení přístupu na základě role podporované službou Azure Service Bus.
Spusťte GitBash na svém počítači.
Spuštěním následujícího příkazu naklonujte řešení projektu Git:
cd ~ git clone https://github.com/MicrosoftDocs/mslearn-connect-services-together.git
Spusťte v počítači VS Code.
Vyberte Soubor –>Otevřít složku ...a pak vyberte složku: C:\Program Files\Git\learn-pr\learn-pr\azure\implement-message-workflows-with-service-bus (za předpokladu, že C:\Program Files\Git je složka Git). Měli byste vidět finální a počáteční podsložky. Pracujete s kódem ve složce start pro psaní kódu pro odesílání a přijímání zpráv. Poslední složka obsahuje kód, který je dokončený.
Napsání kódu pro odeslání zprávy do fronty
V okně Průzkumník kódu vlevo rozbalte privatemessagesender.
Otevřete Program.csa vyhledejte následující řádek kódu:
const string ServiceBusConnectionString = "";
Vložte připojovací řetězec uvedený v uvozovkách.
Pokud jste pro název fronty použili jiný název než
salesmessages
, aktualizujte hodnotu vlastnostiQueueName
v kódu:const string QueueName = "salesmessages";
Chcete-li dokončit komponentu, která odesílá zprávy o prodeji, je nutné přidat
await
operátor, který pozastaví vyhodnocení asynchronní metody, dokud asynchronní operace nebude dokončena. Vyhledejte metoduSendSalesMessageAsync()
. V této metodě najděte následující řádek kódu:// Create a Service Bus client here
Nahraďte tento řádek kódu následujícím kódem:
// 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 want to store off a class reference to the client (rather than a local variable) so that it can be used throughout your program. await using var client = new ServiceBusClient(ServiceBusConnectionString);
SendSalesMessageAsync()
V metodě vyhledejte následující řádek kódu:// Create a sender here
Nahraďte tento komentář následujícím kódem:
await using ServiceBusSender sender = client.CreateSender(QueueName);
try...catch
V bloku najděte následující řádek kódu:// Create and send a message here
Nahraďte tento řádek kódu následujícími řádky kódu:
string messageBody = $"$10,000 order for bicycle parts from retailer Adventure Works."; var message = new ServiceBusMessage(messageBody);
Vložte následující kód na nový řádek přímo pod to, co jste právě přidali, aby se zpráva zobrazila v konzole:
Console.WriteLine($"Sending message: {messageBody}");
Na další řádek vložte následující kód:
await sender.SendMessageAsync(message);
Pokud chcete likvidovat odesílatele a klientské objekty, najděte na konci souboru následující komentář:
// Close the connection to the sender here
Tento řádek nahraďte následujícím kódem:
finally { // Calling DisposeAsync on client types is required to ensure that network // resources and other unmanaged objects are properly cleaned up. await sender.DisposeAsync(); await client.DisposeAsync(); }
Zkontrolujte, jestli se konečný kód Program.cs podobá následujícímu příkladu:
using System; using System.Text; using System.Threading.Tasks; using Azure.Messaging.ServiceBus; namespace privatemessagesender { class Program { const string ServiceBusConnectionString = "Endpoint=sb://example.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxx"; const string QueueName = "salesmessages"; static void Main(string[] args) { Console.WriteLine("Sending a message to the Sales Messages queue..."); SendSalesMessageAsync().GetAwaiter().GetResult(); Console.WriteLine("Message was sent successfully."); } static async Task SendSalesMessageAsync() { await using var client = new ServiceBusClient(ServiceBusConnectionString); await using ServiceBusSender sender = client.CreateSender(QueueName); try { string messageBody = $"$10,000 order for bicycle parts from retailer Adventure Works."; var message = new ServiceBusMessage(messageBody); Console.WriteLine($"Sending message: {messageBody}"); await sender.SendMessageAsync(message); } catch (Exception exception) { Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}"); } finally { // Calling DisposeAsync on client types is required to ensure that network // resources and other unmanaged objects are properly cleaned up. await sender.DisposeAsync(); await client.DisposeAsync(); } } } }
Pokud chcete změny uložit, vyberte Soubor –>Uložit v nabídce nebo zadejte Ctrl+S.
Odeslání zprávy do fronty
V Průzkumníku kódu klikněte pravým tlačítkem na privatemessagesendera pak vyberte Otevřít v integrovaném terminálu.
V podokně terminálu na příkazovém řádku potvrďte, že jste ve složce privatemessagesender a pak zadejte následující příkaz:
dotnet build
.Nyní spusťte aplikaci spuštěním následujícího příkazu:
dotnet run
. Při spuštění programu se zprávy vytisknou do konzoly, která indikuje, že aplikace odesílá zprávu:Sending a message to the Sales Messages queue... Sending message: $10,000 order for bicycle parts from retailer Adventure Works. Message was sent successfully. ```
Po dokončení aplikace spusťte následující příkaz a nahraďte <název> oboru názvů názvem vašeho oboru názvů služby Service Bus. Tento příkaz vrátí počet zpráv, které jsou ve frontě.
az servicebus queue show \ --resource-group "<rgn>[sandbox resource group name]</rgn>" \ --name salesmessages \ --query messageCount \ --namespace-name <namespace-name>
Napsání kódu pro příjem zpráv z fronty
Na stránce Průzkumník kódu rozbalte privatemessagereceiver.
Otevřete Program.csa najděte následující řádek kódu:
const string ServiceBusConnectionString = "";
Mezi uvozovky vložte připojovací řetězec, které jste si uložili dříve.
Vyhledejte metodu
ReceiveSalesMessageAsync()
. V této metodě najděte následující řádek kódu:// Create a Service Bus client that will authenticate using a connection string
Tento řádek nahraďte následujícím 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 tento řádek následujícími řádky kódu:
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
Tento řádek nahraďte následujícím kódem:
await using ServiceBusProcessor processor = client.CreateProcessor(QueueName, processorOptions);
Pokud chcete konfigurovat obslužné rutiny, vyhledejte následující řádek kódu:
// Configure the message and error handler to use
Tento řádek nahraďte následujícím kódem:
processor.ProcessMessageAsync += MessageHandler; processor.ProcessErrorAsync += ErrorHandler;
Chcete-li zahájit zpracování, vyhledejte následující řádek kódu:
// Start processing
Tento řádek nahraďte následujícím kódem:
await processor.StartProcessingAsync();
Pokud chcete připojení ke službě Service Bus zavřít, vyhledejte následující řádek kódu:
// Close the processor here
Tento řádek nahraďte následujícím kódem:
await processor.CloseAsync();
Zkontrolujte kód v
MessageHandler
metodě:// handle received messages static async Task MessageHandler(ProcessMessageEventArgs args) { // extract the message string body = args.Message.Body.ToString(); // print the message Console.WriteLine($"Received: {body}"); // complete the message so that message is deleted from the queue. await args.CompleteMessageAsync(args.Message); }
Zkontrolujte kód v
ErrorHandler
metodě:// handle any errors when receiving messages static Task ErrorHandler(ProcessErrorEventArgs args) { // print the exception message Console.WriteLine(args.Exception.ToString()); return Task.CompletedTask; }
Zkontrolujte, jestli se konečný kód pro privatemessagereceiver/Program.cs podobá následujícímu příkladu:
using System; using System.Text; using System.Threading.Tasks; using Azure.Messaging.ServiceBus; namespace privatemessagereceiver { class Program { const string ServiceBusConnectionString = "Endpoint=sb://<examplenamespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const string QueueName = "salesmessages"; static void Main(string[] args) { ReceiveSalesMessageAsync().GetAwaiter().GetResult(); } static async Task ReceiveSalesMessageAsync() { Console.WriteLine("======================================================"); Console.WriteLine("Press ENTER key to exit after receiving all the messages."); Console.WriteLine("======================================================"); var client = new ServiceBusClient(ServiceBusConnectionString); var processorOptions = new ServiceBusProcessorOptions { MaxConcurrentCalls = 1, AutoCompleteMessages = false }; await using ServiceBusProcessor processor = client.CreateProcessor(QueueName, processorOptions); processor.ProcessMessageAsync += MessageHandler; processor.ProcessErrorAsync += ErrorHandler; await processor.StartProcessingAsync(); Console.Read(); await processor.CloseAsync(); } // handle received messages static async Task MessageHandler(ProcessMessageEventArgs args) { string body = args.Message.Body.ToString(); Console.WriteLine($"Received: {body}"); // complete the message. messages is deleted from the queue. await args.CompleteMessageAsync(args.Message); } // handle any errors when receiving messages static Task ErrorHandler(ProcessErrorEventArgs args) { Console.WriteLine(args.Exception.ToString()); return Task.CompletedTask; } } }
Pokud chcete změny uložit, vyberte Soubor –>Uložit v nabídce nebo zadejte Ctrl+S.
Přijetí zprávy z fronty
V Průzkumníku kódu klepněte pravým tlačítkem myši na privatemessagereceivera pak vyberte Otevřít v integrovaném terminálu.
V podokně terminálu na příkazovém řádku potvrďte, že jste ve složce privatemessagereceiver a pak zadejte následující příkaz:
dotnet build
.Nyní spusťte aplikaci spuštěním následujícího příkazu:
dotnet run
.====================================================== Press ENTER key to exit after receiving all the messages. ====================================================== Received: $10,000 order for bicycle parts from retailer Adventure Works.
Když vidíte, že zprávy byly přijaty v Cloud Shellu, stiskněte ENTER pro zastavení aplikace.
Kontrola počtu zpráv
Spuštěním následujícího kódu potvrďte, že všechny zprávy byly z fronty odebrány, a nezapomeňte nahradit <název> oboru názvů vaším oborem názvů služby Service Bus.
az servicebus queue show \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--name salesmessages \
--query messageCount \
--namespace-name <namespace-name>
Výstup je 0
, pokud byly odebrány všechny zprávy.
Napsali jste kód, který odesílá zprávu o individuálním prodeji do fronty služby Service Bus. V distribuované aplikaci Salesforce byste měli tento kód napsat do mobilní aplikace, kterou používají pracovníci prodeje na zařízeních.
Napsali jste také kód, který obdrží zprávu z fronty služby Service Bus. V distribuované aplikaci Salesforce byste měli napsat tento kód ve webové službě, která běží v Azure a zpracovává přijaté zprávy.