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

Dokončeno

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.

  1. Spusťte GitBash na svém počítači.

  2. 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
    
  3. Spusťte v počítači VS Code.

  4. 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

  1. V okně Průzkumník kódu vlevo rozbalte privatemessagesender.

  2. Otevřete Program.csa vyhledejte následující řádek kódu:

    const string ServiceBusConnectionString = "";
    

    Vložte připojovací řetězec uvedený v uvozovkách.

  3. Pokud jste pro název fronty použili jiný název než salesmessages, aktualizujte hodnotu vlastnosti QueueName v kódu:

    const string QueueName = "salesmessages";
    
  4. 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 metodu SendSalesMessageAsync() . 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);
    
  5. 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);
    
  6. 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);
    
  7. 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}");
    
  8. Na další řádek vložte následující kód:

    await sender.SendMessageAsync(message);
    
  9. 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();
    }
    
  10. 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();
                }
            }
        }
    }
    
  11. Pokud chcete změny uložit, vyberte Soubor –>Uložit v nabídce nebo zadejte Ctrl+S.

Odeslání zprávy do fronty

  1. V Průzkumníku kódu klikněte pravým tlačítkem na privatemessagesendera pak vyberte Otevřít v integrovaném terminálu.

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

  3. 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.    ```
    
  4. 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

  1. Na stránce Průzkumník kódu rozbalte privatemessagereceiver.

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

  3. 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);
    
  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 tento řádek následujícími řádky kódu:

    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
    

    Tento řádek nahraďte následujícím kódem:

    await using ServiceBusProcessor processor = client.CreateProcessor(QueueName, processorOptions);
    
  6. 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;
    
  7. 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();
    
  8. 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();
    
  9. 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);
    }
    
  10. 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;
    }    
    
  11. 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;
            }
        }
    }
    
    
  12. Pokud chcete změny uložit, vyberte Soubor –>Uložit v nabídce nebo zadejte Ctrl+S.

Přijetí zprávy z fronty

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

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

  3. 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.
    
  4. 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.