Gyakorlat – Üzenetek küldése és fogadása témakör használatával

Befejeződött

Úgy döntött, hogy egy Azure Service Bus-témakört használ értékesítési teljesítményüzenetek terjesztésére a Salesforce-alkalmazásban. Az értékesítési munkatársak az alkalmazást mobileszközökön használják az egyes területekre és időszakokra vonatkozó értékesítési adatokat összegző üzenetek küldésére. Ezeket az üzeneteket a vállalat működési régióiban található webszolgáltatásokhoz osztja el, beleértve az Amerikai Egyesült Államokat és Európát is.

Már implementálta a témakörhöz szükséges infrastruktúrát az Azure-előfizetéseiben. Most meg kell írnia azt a kódot, amely üzeneteket küld a témakörnek, és olyan kódot szeretne írni, amely lekéri az üzeneteket egy előfizetésből. Ezután üzenetet fog küldeni egy témakörnek, és lekéri egy adott előfizetés üzenetét.

Győződjön meg arról, hogy a megfelelő könyvtárban dolgozik az alábbi parancsok futtatásával az Azure Cloud Shellben:

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

Kód írása egy témakörbe küldött üzenet küldéséhez

Az értékesítési teljesítményről üzeneteket küldő összetevő befejezéséhez hajtsa végre az alábbi lépéseket:

  1. Az Azure Cloud Shell-szerkesztőben nyissa meg a performancemessagesender/Program.cs fájlt, és keresse meg a következő kódsort:

    const string ServiceBusConnectionString = "";
    

    Az idézőjelek közé illessze be az előző gyakorlatban mentett kapcsolati sztring.

  2. Ha az üzenetsor nevének salesperformancemessages-től eltérő nevet használt, frissítse a kódban szereplő tulajdonság értékétTopicName:

    const string TopicName = "salesperformancemessages";
    
  3. Keresse meg a metódust SendPerformanceMessageAsync() . (Tipp: A 26.) Ezen a metóduson belül keresse meg a következő kódsort:

    // Create a Service Bus client here
    

    Cserélje le ezt a kódsort a következő kódra:

    // 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. A metóduson SendPerformanceMessageAsync() belül keresse meg a következő kódsort:

    // Create a sender here
    

    Cserélje le ezt a kódsort a következő kódra:

    await using ServiceBusSender sender = client.CreateSender(TopicName);
    
  5. A blokkban try...catch keresse meg a következő kódsort:

    // Create and send a message here
    

    Cserélje le ezt a kódsort a következő kódra:

    string messageBody = "Total sales for Brazil in August: $13m.";
    var message = new ServiceBusMessage(messageBody);
    
  6. Az üzenet konzolon való megjelenítéséhez szúrja be a következő kódot a következő sorba:

    Console.WriteLine($"Sending message: {messageBody}");
    
  7. Ha el szeretné küldeni az üzenetet a témakörnek, szúrja be a következő kódot a következő sorba:

    await sender.SendMessageAsync(message);
    
  8. Ellenőrizze, hogy a végleges kód hasonlít-e a következő példára:

    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=AbCdEfGhIjKlMnOpQrStUvWxYz==";
            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. A fájlt a Ctrl+S billentyűkombinációval mentse el, majd a Ctrl+Q billentyűkombinációval zárja be a szerkesztőt.

Üzenet küldése a témakörbe

  1. Az értékesítésről üzenetet küldő összetevő futtatásához futtassa a következő parancsot a Cloud Shellben:

    dotnet run --project performancemessagesender
    
  2. A program végrehajtásakor figyelje meg azokat az értesítéseket a Cloud Shellben, amelyek azt jelzik, hogy az üzenet küldése folyamatban van. Minden alkalommal, amikor futtatja az alkalmazást, egy másik üzenet kerül a témakörbe, és minden előfizetéshez elérhetővé válik egy példány.

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

Az előfizetéshez tartozó üzenetek lekérése előtt ellenőrizze az üzenetek számát

Amikor megjelenik Message was sent successfully, futtassa a következő parancsot, hogy lássa, hány üzenet található az Americas előfizetésben. Ne felejtse el lecserélni <a névteret> a Service Bus-névtérre.

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

Ha lecseréli AmericasEuropeAndAsia és újra futtatja a parancsot, látni fogja, hogy mindkét előfizetés azonos számú üzenettel rendelkezik.

Kód írása egy előfizetés témakörüzenetének lekéréséhez

Az értékesítési teljesítménnyel kapcsolatos üzeneteket lekérő összetevő létrehozásához hajtsa végre az alábbi lépéseket:

  1. Futtassa code . a szerkesztő elindításához.

  2. A szerkesztőben nyissa meg a performancemessagereceiver/Program.cs fájlt, és keresse meg a következő kódsort:

    const string ServiceBusConnectionString = "";
    

    Az idézőjelek közé illessze be az előző gyakorlatban mentett kapcsolati sztring.

  3. Service Bus-ügyfél létrehozásához keresse meg a metódust MainAsync() . Ezen a metóduson belül keresse meg a kód alábbi sorát:

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

    Írja felül ezt a sort az alábbi kóddal:

    var client = new ServiceBusClient(ServiceBusConnectionString);
    
  4. Az üzenetkezelési beállítások konfigurálásához keresse meg a következő kódsort:

    // Create the options to use for configuring the processor
    

    Írja felül ezt a sort az alábbi kóddal:

    var processorOptions = new ServiceBusProcessorOptions
    {
        MaxConcurrentCalls = 1,
        AutoCompleteMessages = false
    };
    
  5. Processzor létrehozásához keresse meg a következő kódsort:

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

    Írja felül ezt a sort az alábbi kóddal:

    ServiceBusProcessor processor = client.CreateProcessor(TopicName, SubscriptionName, processorOptions);
    
  6. A kezelő konfigurálásához keresse meg a következő kódsort:

    // Configure the message and error handler to use
    

    Írja felül ezt a sort az alábbi kóddal:

    processor.ProcessMessageAsync += MessageHandler;
    processor.ProcessErrorAsync += ErrorHandler;
    
  7. A feldolgozás megkezdéséhez keresse meg a következő kódsort:

    // Start processing
    

    Írja felül ezt a sort az alábbi kóddal:

    await processor.StartProcessingAsync();
    
  8. Keresse meg a következő kódsort:

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

    Cserélje le a sort a következő kódra:

    await processor.DisposeAsync();
    await client.DisposeAsync();    
    
  9. A bejövő üzenetek konzolon való megjelenítéséhez keresse meg a metódust MessageHandler() . Regisztrálta ezt a metódust a bejövő üzenetek kezeléséhez.

    Cserélje le a metóduson belüli összes kódot a következő kódra:

    Console.WriteLine($"Received message: SequenceNumber:{args.Message.SequenceNumber} Body:{args.Message.Body}");
    
  10. A fogadott üzenet előfizetésből való törléséhez a következő sorba írja be az alábbi kódot:

    await args.CompleteMessageAsync(args.Message);
    
  11. Ellenőrizze, hogy a végleges kód hasonlít-e a következő példára:

    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=LIWIyxs8baqQ0bRf5zJLef6OTfrv0kBEDxFM/ML37Zs=";
            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. A fájlt a Ctrl+S billentyűkombinációval mentse el, majd a Ctrl+Q billentyűkombinációval zárja be a szerkesztőt.

Témakörüzenet lekérése előfizetéshez

  1. Az előfizetés értékesítési teljesítményével kapcsolatos üzenetet lekérő összetevő futtatásához futtassa a következő parancsot:

    dotnet run --project performancemessagereceiver
    

    A következőhöz hasonló kimenet fog megjelenni:

    Received message: SequenceNumber:1 Body:Total sales for Brazil in August: $13m.
    
  2. Amikor a program értesítéseket adott vissza arról, hogy üzeneteket fogad, nyomja le az Enter billentyűt az alkalmazás leállításához.

Az előfizetés üzenetének lekérése után ellenőrizze az üzenetek számát

Futtassa a következő parancsot annak ellenőrzéséhez, hogy nincsenek-e még üzenetek az Americas előfizetésben. Mindenképpen cserélje le <a névtér nevét> a Service Bus-névtérre.

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

Ha ebben a kódban lecseréli AmericasEuropeAndAsia az előfizetés aktuális üzenetszámátEuropeAndAsia, látni fogja, hogy az üzenetszám .1 Az előző kódban csak Americas a témakörüzenetek lekérésére lett beállítva, így az üzenet továbbra is a lekérésére EuropeAndAsia vár.