Oefening: berichten verzenden en ontvangen met behulp van een onderwerp

Voltooid

U hebt besloten om een Azure Service Bus-onderwerp te gebruiken om verkoopprestatieberichten te distribueren in uw Salesforce-toepassing. Verkoopmedewerkers gebruiken de app op hun mobiele apparaten om berichten te verzenden die verkoopcijfers voor elk gebied en elke periode samenvatten. Deze berichten worden gedistribueerd naar webservices die zich in de operationele regio's van het bedrijf bevinden, waaronder Amerika en Europa.

U hebt de benodigde infrastructuur al geïmplementeerd in uw Azure-abonnementen voor het onderwerp. Nu wilt u de code schrijven waarmee berichten naar het onderwerp worden verzonden en code wordt geschreven waarmee berichten uit een abonnement worden opgehaald. Vervolgens verzendt u een bericht naar een onderwerp en haalt u het bericht voor een specifiek abonnement op.

Zorg ervoor dat u in de juiste map werkt door de volgende opdrachten uit te voeren in Azure Cloud Shell:

cd ~/mslearn-connect-services-together/implement-message-workflows-with-service-bus/src/start
code .

Code schrijven om een bericht naar een onderwerp te verzenden

Voer de volgende stappen uit om het onderdeel te voltooien dat berichten over verkoopprestaties verzendt:

  1. Open in de Azure Cloud Shell-editor performancemessagesender/Program.cs en zoek de volgende coderegel:

    const string ServiceBusConnectionString = "";
    

    Plak tussen de aanhalingstekens de verbindingsreeks die u in de vorige oefening hebt opgeslagen.

  2. Als u een andere naam dan salesperformancemessages voor de wachtrijnaam hebt gebruikt, werkt u de waarde voor TopicName de eigenschap in de code bij:

    const string TopicName = "salesperformancemessages";
    
  3. Zoek de SendPerformanceMessageAsync() methode. (Hint: het bevindt zich op of in de buurt van regel 26.) Zoek binnen die methode de volgende coderegel:

    // Create a Service Bus client here
    

    Vervang die coderegel door deze code:

    // 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);
    
  4. Zoek in de SendPerformanceMessageAsync() methode de volgende coderegel:

    // Create a sender here
    

    Vervang die coderegel door deze code:

    await using ServiceBusSender sender = client.CreateSender(TopicName);
    
  5. Zoek in het try...catch blok de volgende coderegel:

    // Create and send a message here
    

    Vervang die coderegel door deze code:

    string messageBody = "Total sales for Brazil in August: $13m.";
    var message = new ServiceBusMessage(messageBody);
    
  6. Als u het bericht in de console wilt weergeven, voegt u de volgende code in op de volgende regel:

    Console.WriteLine($"Sending message: {messageBody}");
    
  7. Als u het bericht naar het onderwerp wilt verzenden, voegt u de volgende code in op de volgende regel:

    await sender.SendMessageAsync(message);
    
  8. Controleer of uw uiteindelijke code lijkt op het volgende voorbeeld:

    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}");
                }
            }
        }
    }
    
  9. Selecteer Ctrl+S om uw wijzigingen op te slaan en selecteer vervolgens Ctrl+Q om de editor te sluiten.

Een bericht naar het onderwerp verzenden

  1. Als u het onderdeel wilt uitvoeren dat een bericht over een verkoop verzendt, voert u de volgende opdracht uit in Cloud Shell:

    dotnet run --project performancemessagesender
    
  2. Terwijl het programma wordt uitgevoerd, bekijkt u meldingen in Cloud Shell die aangeven dat er een bericht wordt verzonden. Telkens wanneer u de app uitvoert, wordt er een ander bericht toegevoegd aan het onderwerp en wordt er een kopie beschikbaar voor elk abonnement.

    Sending a message to the Sales Performance topic...
    Sending message: Total sales for Brazil in August: $13m.
    Message was sent successfully.
    

Controleer het aantal berichten voordat u berichten voor een abonnement ophaalt

Wanneer u dit ziet Message was sent successfully, voert u de volgende opdracht uit om te zien hoeveel berichten zich in het Americas abonnement bevinden. Vergeet niet om de naamruimtenaam> te vervangen door <uw Service Bus-naamruimte.

az servicebus topic subscription show \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --topic-name salesperformancemessages \
    --name Americas \
    --query messageCount \
    --namespace-name <namespace-name>

Als u de opdracht vervangt Americas EuropeAndAsia en opnieuw uitvoert, ziet u dat beide abonnementen hetzelfde aantal berichten hebben.

Code schrijven om een onderwerpbericht voor een abonnement op te halen

Voer de volgende stappen uit om het onderdeel te maken dat berichten over verkoopprestaties ophaalt:

  1. Voer code . uit om de editor te starten.

  2. Open in de editor performancemessagereceiver/Program.cs en zoek de volgende coderegel:

    const string ServiceBusConnectionString = "";
    

    Plak tussen de aanhalingstekens de verbindingsreeks die u in de vorige oefening hebt opgeslagen.

  3. Als u een Service Bus-client wilt maken, zoekt u de MainAsync() methode. Zoek in die methode de volgende coderegel:

    // Create a Service Bus client that will authenticate using a connection string
    

    Vervang deze regel door de volgende code:

    var client = new ServiceBusClient(ServiceBusConnectionString);
    
  4. Als u opties voor berichtafhandeling wilt configureren, zoekt u de volgende regel code:

    // Create the options to use for configuring the processor
    

    Vervang deze regel door de volgende code:

    var processorOptions = new ServiceBusProcessorOptions
    {
        MaxConcurrentCalls = 1,
        AutoCompleteMessages = false
    };
    
  5. Als u een processor wilt maken, zoekt u de volgende coderegel:

    // Create a processor that we can use to process the messages
    

    Vervang deze regel door de volgende code:

    ServiceBusProcessor processor = client.CreateProcessor(TopicName, SubscriptionName, processorOptions);
    
  6. Als u de handler wilt configureren, zoekt u de volgende coderegel:

    // Configure the message and error handler to use
    

    Vervang deze regel door de volgende code:

    processor.ProcessMessageAsync += MessageHandler;
    processor.ProcessErrorAsync += ErrorHandler;
    
  7. Als u wilt beginnen met verwerken, zoekt u de volgende coderegel:

    // Start processing
    

    Vervang deze regel door de volgende code:

    await processor.StartProcessingAsync();
    
  8. Zoek de volgende regel code:

    // Since we didn't use the "await using" syntax here, we need to explicitly dispose the processor and client    
    

    Vervang de regel door deze code:

    await processor.DisposeAsync();
    await client.DisposeAsync();    
    
  9. Als u binnenkomende berichten in de console wilt weergeven, zoekt u de MessageHandler() methode. U hebt deze methode geregistreerd om binnenkomende berichten te verwerken.

    Vervang alle code in die methode door de volgende code:

    Console.WriteLine($"Received message: SequenceNumber:{args.Message.SequenceNumber} Body:{args.Message.Body}");
    
  10. Voeg op de volgende regel de volgende code toe om het ontvangen bericht uit het abonnement te verwijderen:

    await args.CompleteMessageAsync(args.Message);
    
  11. Controleer of uw uiteindelijke code lijkt op het volgende voorbeeld:

    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;
            }
        }
    }
    
  12. Selecteer Ctrl+S om uw wijzigingen op te slaan en selecteer vervolgens Ctrl+Q om de editor te sluiten.

Een onderwerpbericht voor een abonnement ophalen

  1. Voer de volgende opdracht uit om het onderdeel uit te voeren dat een bericht over verkoopprestaties voor een abonnement ophaalt:

    dotnet run --project performancemessagereceiver
    

    De uitvoer is vergelijkbaar met de uitvoer in het volgende voorbeeld:

    Received message: SequenceNumber:1 Body:Total sales for Brazil in August: $13m.
    
  2. Wanneer het programma meldingen heeft geretourneerd die berichten ontvangen, drukt u op Enter om de app te stoppen.

Controleer het aantal berichten nadat u een bericht voor een abonnement hebt opgehaald

Voer de volgende opdracht uit om te bevestigen dat er geen resterende berichten in het Americas abonnement zijn. Zorg ervoor dat u de naamruimtenaam> vervangt door <uw Service Bus-naamruimte.

az servicebus topic subscription show \
     --resource-group "<rgn>[sandbox resource group name]</rgn>" \
     --topic-name salesperformancemessages \
     --name Americas \
     --query messageCount \
     --namespace-name <namespace-name> 

Als u in deze code vervangt Americas EuropeAndAsia om het huidige aantal berichten voor het EuropeAndAsia abonnement te zien, ziet u dat het aantal berichten is 1. In de voorgaande code is alleen Americas ingesteld op het ophalen van onderwerpberichten, zodat het bericht nog steeds wacht EuropeAndAsia op ophalen.