Övning – Skicka och ta emot meddelanden med hjälp av ett ämne
Du har bestämt dig för att använda ett Azure Service Bus-ämne för att distribuera försäljningsprestandameddelanden i ditt salesforce-program. Säljare använder appen på sina mobila enheter för att skicka meddelanden som sammanfattar försäljningssiffror för varje område och tidsperiod. Dessa meddelanden distribueras till webbtjänster som finns i företagets operativa regioner, inklusive Amerika och Europa.
Du har redan implementerat nödvändig infrastruktur i dina Azure-prenumerationer för ämnet. Nu vill du skriva den kod som skickar meddelanden till ämnet och skriva kod som hämtar meddelanden från en prenumeration. Sedan skickar du ett meddelande till ett ämne och hämtar meddelandet för en specifik prenumeration.
Skriva kod för att skicka ett meddelande till ett ämne
Slutför komponenten som skickar meddelanden om försäljningsprestanda genom att utföra följande steg:
I fönstret Code Explorer till vänster expanderar du performancemessagesender.
Öppna Program.csoch leta upp följande kodrad:
const string ServiceBusConnectionString = "";
Mellan citattecknen klistrar du in anslutningssträng som du sparade i föregående övning.
Om du använde ett annat namn än salesperformancemessages för könamnet uppdaterar du värdet för
TopicName
egenskapen i koden:const string TopicName = "salesperformancemessages";
SendPerformanceMessageAsync()
Hitta metoden. (Tips: Det är på eller nära rad 26.) I den metoden hittar du följande kodrad:// Create a Service Bus client here
Ersätt den kodraden med den här koden:
// 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);
Leta upp följande kodrad i
SendPerformanceMessageAsync()
metoden:// Create a sender here
Ersätt den kodraden med den här koden:
await using ServiceBusSender sender = client.CreateSender(TopicName);
try...catch
Leta upp följande kodrad i blocket:// Create and send a message here
Ersätt den kodraden med den här koden:
string messageBody = "Total sales for Brazil in August: $13m."; var message = new ServiceBusMessage(messageBody);
Om du vill visa meddelandet i konsolen infogar du följande kod på nästa rad:
Console.WriteLine($"Sending message: {messageBody}");
Om du vill skicka meddelandet till ämnet infogar du följande kod på nästa rad:
await sender.SendMessageAsync(message);
Kontrollera att den slutliga koden liknar följande exempel:
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}"); } } } }
Spara ändringarna genom att välja Fil –>Spara på menyn eller ange Ctrl+S-.
Skicka ett meddelande till ämnet
I Code Explorer högerklickar du på performancemessagesenderoch väljer sedan Öppna i integrerad terminal.
I terminalfönstret i kommandotolken kontrollerar du att du är i mappen performancemessagesender 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. Varje gång du kör appen läggs ett annat meddelande till i ämnet och en kopia blir tillgänglig för varje prenumeration.Sending a message to the Sales Performance topic... Sending message: Total sales for Brazil in August: $13m. Message was sent successfully.
Kontrollera antalet meddelanden innan du hämtar meddelanden för en prenumeration
När du ser Message was sent successfully
kör du följande kommando för att se hur många meddelanden som finns i prenumerationen Americas
. Kom ihåg att ersätta <namnområdesnamnet> med Service Bus-namnområdet.
az servicebus topic subscription show \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--topic-name salesperformancemessages \
--name Americas \
--query messageCount \
--namespace-name <namespace-name>
Om du ersätter Americas
med EuropeAndAsia
och kör kommandot igen ser du att båda prenumerationerna har samma antal meddelanden.
Skriva kod för att hämta ett ämnesmeddelande för en prenumeration
Utför följande steg för att skapa komponenten som hämtar meddelanden om försäljningsprestanda:
På sidan Code Explorer expanderar du performancemessagereceiver.
Öppna Program.csoch hitta följande kodrad:
const string ServiceBusConnectionString = "";
Mellan citattecknen klistrar du in anslutningssträng som du sparade i föregående övning.
Om du vill skapa en Service Bus-klient letar du reda på
MainAsync()
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 den raden med följande kod:
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:
ServiceBusProcessor processor = client.CreateProcessor(TopicName, SubscriptionName, processorOptions);
Om du vill konfigurera hanteraren letar du upp 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();
Leta efter följande kodrad:
// Since we didn't use the "await using" syntax here, we need to explicitly dispose the processor and client
Ersätt raden med den här koden:
await processor.DisposeAsync(); await client.DisposeAsync();
Om du vill visa inkommande meddelanden i konsolen letar du upp
MessageHandler()
metoden. Du har registrerat den här metoden för att hantera inkommande meddelanden.Ersätt all kod i metoden med följande kod:
Console.WriteLine($"Received message: SequenceNumber:{args.Message.SequenceNumber} Body:{args.Message.Body}");
För att ta bort det mottagna meddelandet från prenumerationen lägger du till följande kod på nästa rad:
await args.CompleteMessageAsync(args.Message);
Kontrollera att den slutliga koden liknar följande exempel:
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; } } }
Spara ändringarna genom att välja Fil –>Spara på menyn eller ange Ctrl+S-.
Hämta ett ämnesmeddelande för en prenumeration
- I Code Explorer högerklickar du på performancemessagereceiveroch väljer sedan Öppna i integrerad terminal.
- I terminalfönstret i kommandotolken kontrollerar du att du är i mappen performancemessagereceiver och anger sedan följande kommando:
dotnet build
. - Kör nu programmet genom att köra följande kommando:
dotnet run
. - När programmet har returnerat meddelanden om att det tar emot meddelanden trycker du på Retur för att stoppa appen.
Kontrollera antalet meddelanden när du har hämtat ett meddelande för en prenumeration
Kör följande kommando för att bekräfta att det inte finns några återstående meddelanden i prenumerationen Americas
. Se till att ersätta <namnområdesnamn> med Service Bus-namnområdet.
az servicebus topic subscription show \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--topic-name salesperformancemessages \
--name Americas \
--query messageCount \
--namespace-name <namespace-name>
Om du ersätter Americas
med EuropeAndAsia
i den här koden för att se det aktuella antalet meddelanden för EuropeAndAsia
-prenumerationen ser du att antalet meddelanden är 1
. I föregående kod angavs endast Americas
för att hämta ämnesmeddelanden, så meddelandet väntar fortfarande på EuropeAndAsia
att hämta det.