Övning – Skicka och ta emot meddelanden med hjälp av en kö
Du har valt att använda en Service Bus-kö för att hantera meddelanden om enskild försäljning mellan mobilappen, som säljpersonalen använder, och den webbtjänst som finns i Azure, som lagrar information om varje försäljning i en Azure SQL Database-instans.
I föregående övning implementerade du de nödvändiga objekten i din Azure-prenumeration. Nu vill du skriva kod som skickar meddelanden till kön och hämtar meddelanden.
I den här lektionen skapar du två konsolprogram: ett program placerar meddelanden i en Service Bus-kö och ett program hämtar meddelanden från en Service Bus-kö. Programmen är en del av en enda .NET Core-lösning.
Klona och öppna startprogrammet
Kommentar
För enkelhetens skull instruerar följande uppgifter dig att hårdkoda anslutningssträng i Program.cs-filen för båda konsolprogrammen. I ett produktionsprogram bör du använda rollbaserad åtkomstkontrollautentisering som stöds av Azure Service Bus.
Starta GitBash på datorn.
Kör följande kommando för att klona Git-projektlösningen:
cd ~ git clone https://github.com/MicrosoftDocs/mslearn-connect-services-together.git
Starta VS Code på datorn.
Välj File –>Open Folder ...och välj sedan mappen: C:\Program Files\Git\learn-pr\learn-pr\azure\implement-message-workflows-with-service-bus (förutsatt att C:\Program Files\Git är Git-mappen). Du bör se slutgiltiga och starta undermappar. Du arbetar med kod i starta mapp för att skriva kod för att skicka och ta emot meddelanden. Mappen sista innehåller koden som är klar.
Skriva kod för att skicka ett meddelande till en kö
I fönstret Code Explorer till vänster expanderar du privatemessagesender.
Öppna Program.csoch leta upp följande kodrad:
const string ServiceBusConnectionString = "";
Klistra in anslutningssträngen mellan citattecknen.
Om du använde ett annat namn än
salesmessages
för könamnet uppdaterar du värdet förQueueName
egenskap i koden:const string QueueName = "salesmessages";
För att slutföra komponenten som skickar meddelanden om försäljning måste du lägga till en
await
operator för att pausa utvärderingen av asynkron metod tills den asynkrona åtgärden har slutförts.SendSalesMessageAsync()
Hitta metoden. Leta upp följande kodrad i den aktuella metoden:// Create a Service Bus client here
Ersätt den kodraden med följande kod:
// 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);
Leta upp följande kodrad i
SendSalesMessageAsync()
metoden:// Create a sender here
Ersätt kommentaren med följande kod:
await using ServiceBusSender sender = client.CreateSender(QueueName);
Leta upp följande kodrad i
try...catch
blocket:// Create and send a message here
Ersätt den kodraden med följande kodrader:
string messageBody = $"$10,000 order for bicycle parts from retailer Adventure Works."; var message = new ServiceBusMessage(messageBody);
Infoga följande kod på en ny rad direkt under det du precis lade till för att visa meddelandet i konsolen:
Console.WriteLine($"Sending message: {messageBody}");
Infoga följande kod på nästa rad:
await sender.SendMessageAsync(message);
Om du vill ta bort avsändare och klientobjekt letar du upp följande kommentar i slutet av filen:
// Close the connection to the sender here
Ersätt den raden med följande kod:
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(); }
Kontrollera att den slutliga koden för Program.cs liknar följande exempel:
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(); } } } }
Spara ändringarna genom att välja Fil –>Spara på menyn eller ange Ctrl+S-.
Skicka ett meddelande till kön
I Code Explorer högerklickar du på privatemessagesenderoch väljer sedan Öppna i integrerad terminal.
I terminalfönstret i kommandotolken kontrollerar du att du är i mappen privatemessagesender och anger sedan följande kommando:
dotnet build
.Kör nu programmet genom att köra följande kommando:
dotnet run
. När programmet körs skrivs meddelanden ut till konsolen som anger att appen skickar ett meddelande:Sending a message to the Sales Messages queue... Sending message: $10,000 order for bicycle parts from retailer Adventure Works. Message was sent successfully. ```
När appen är klar kör du följande kommando och ersätter <namnområdesnamnet> med namnet på ditt Service Bus-namnområde. Det här kommandot returnerar antalet meddelanden som finns i kön.
az servicebus queue show \ --resource-group "<rgn>[sandbox resource group name]</rgn>" \ --name salesmessages \ --query messageCount \ --namespace-name <namespace-name>
Skriva kod för att ta emot meddelanden från kön
På sidan Code Explorer expanderar du privatemessagereceiver.
Öppna Program.csoch hitta följande kodrad:
const string ServiceBusConnectionString = "";
Mellan citattecknen klistrar du in anslutningssträng som du sparade tidigare.
ReceiveSalesMessageAsync()
Hitta metoden. Leta upp följande kodrad i den aktuella metoden:// Create a Service Bus client that will authenticate using a connection string
Ersätt den raden med följande kod:
var client = new ServiceBusClient(ServiceBusConnectionString);
Om du vill konfigurera alternativ för meddelandehantering hittar du följande kodrad:
// Create the options to use for configuring the processor
Ersätt raden med följande kodrader:
var processorOptions = new ServiceBusProcessorOptions { MaxConcurrentCalls = 1, AutoCompleteMessages = false };
Om du vill skapa en processor hittar du följande kodrad:
// Create a processor that we can use to process the messages
Ersätt den raden med följande kod:
await using ServiceBusProcessor processor = client.CreateProcessor(QueueName, processorOptions);
Om du vill konfigurera hanterarna hittar du följande kodrad:
// Configure the message and error handler to use
Ersätt den raden med följande kod:
processor.ProcessMessageAsync += MessageHandler; processor.ProcessErrorAsync += ErrorHandler;
Om du vill börja bearbeta letar du upp följande kodrad:
// Start processing
Ersätt den raden med följande kod:
await processor.StartProcessingAsync();
Om du vill stänga anslutningen till Service Bus hittar du följande kodrad:
// Close the processor here
Ersätt den raden med följande kod:
await processor.CloseAsync();
Granska koden i
MessageHandler
metoden:// 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); }
Granska koden i
ErrorHandler
metoden:// handle any errors when receiving messages static Task ErrorHandler(ProcessErrorEventArgs args) { // print the exception message Console.WriteLine(args.Exception.ToString()); return Task.CompletedTask; }
Kontrollera att den slutliga koden för privatemessagereceiver/Program.cs liknar följande exempel:
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; } } }
Spara ändringarna genom att välja Fil –>Spara på menyn eller ange Ctrl+S-.
Ta emot ett meddelande från kön
I Code Explorer högerklickar du på privatemessagereceiveroch väljer sedan Öppna i integrerad terminal.
I terminalfönstret i kommandotolken kontrollerar du att du är i mappen privatemessagereceiver och anger sedan följande kommando:
dotnet build
.Kör nu programmet genom att köra följande kommando:
dotnet run
.====================================================== Press ENTER key to exit after receiving all the messages. ====================================================== Received: $10,000 order for bicycle parts from retailer Adventure Works.
När du ser att meddelandena har tagits emot i Cloud Shell, ENTER för att stoppa appen.
Kontrollera antalet meddelanden
Kör följande kod för att bekräfta att alla meddelanden har tagits bort från kön och kom ihåg att ersätta <namnområdesnamn> med Service Bus-namnområdet.
az servicebus queue show \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--name salesmessages \
--query messageCount \
--namespace-name <namespace-name>
Utdata är 0
om alla meddelanden har tagits bort.
Du har skrivit kod som skickar ett meddelande om enskild försäljning till en Service Bus-kö. I det distribuerade salesforce-programmet bör du skriva den här koden i mobilappen som säljpersonalen använder på enheter.
Du har också skrivit kod som tar emot ett meddelande från Service Bus-kön. I det distribuerade salesforce-programmet bör du skriva den här koden i webbtjänsten som körs i Azure och bearbeta mottagna meddelanden.