Cvičení – odesílání a příjem zpráv pomocí tématu

Dokončeno

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:

  1. 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í.

  2. Pokud jste pro název fronty použili jiný název než salesperformancemessages , aktualizujte hodnotu vlastnosti TopicName v kódu:

    const string TopicName = "salesperformancemessages";
    
  3. 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);
    
  4. 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);
    
  5. 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);
    
  6. Pokud chcete zobrazit zprávu v konzole, vložte na další řádek následující kód:

    Console.WriteLine($"Sending message: {messageBody}");
    
  7. Pokud chcete odeslat zprávu do tématu, vložte na další řádek následující kód:

    await sender.SendMessageAsync(message);
    
  8. 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}");
                }
            }
        }
    }
    
  9. Stisknutím Ctrl+S uložte změny a stisknutím Ctrl+Q zavřete editor.

Odeslání zprávy do tématu

  1. 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
    
  2. 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:

  1. Spuštěním spusťte code . editor.

  2. 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í.

  3. 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);
    
  4. 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
    };
    
  5. 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);
    
  6. 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;
    
  7. 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();
    
  8. 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();    
    
  9. 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}");
    
  10. 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);
    
  11. 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;
            }
        }
    }
    
  12. 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

  1. 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.
    
  2. 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í.