Alıştırma - Konu başlığı kullanarak ileti gönderme ve alma

Tamamlandı

Salesforce uygulamanızda satış performansı iletilerini dağıtmak için bir Azure Service Bus konusu kullanmaya karar verdiniz. Satış personeli, uygulamayı mobil cihazlarında kullanarak her bir alan ve zaman aralığı için satış rakamlarını özetleyen iletiler gönderir. Bu iletiler, Amerika ve Avrupa dahil olmak üzere şirketin operasyonel bölgelerinde bulunan web hizmetlerine dağıtılır.

Konu için Azure aboneliklerinizde gerekli altyapıyı zaten uyguladınız. Şimdi konu başlığına ileti gönderen kodu yazmak ve abonelikten ileti alan kod yazmak istiyorsunuz. Ardından, bir konuya ileti gönderir ve belirli bir abonelik için iletiyi alırsınız.

Azure Cloud Shell'de aşağıdaki komutları çalıştırarak doğru dizinde çalıştığınızdan emin olun:

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

Bir konuya ileti göndermek için kod yazma

Satış performansı hakkında ileti gönderen bileşeni tamamlamak için şu adımları tamamlayın:

  1. Azure Cloud Shell düzenleyicisinde performancemessagesender/Program.cs dosyasını açın ve aşağıdaki kod satırını bulun:

    const string ServiceBusConnectionString = "";
    

    Tırnak işaretleri arasına, önceki alıştırmada kaydettiğiniz bağlantı dizesi yapıştırın.

  2. Kuyruk adı için salesperformancemessages değerinden farklı bir ad kullandıysanız koddaki özelliğin değerini TopicName güncelleştirin:

    const string TopicName = "salesperformancemessages";
    
  3. SendPerformanceMessageAsync() yöntemini bulun. (İpucu: 26. satırda veya yakınındadır.) Bu yöntemde aşağıdaki kod satırını bulun:

    // Create a Service Bus client here
    

    Bu kod satırını şu kodla değiştirin:

    // 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. yönteminde SendPerformanceMessageAsync() aşağıdaki kod satırını bulun:

    // Create a sender here
    

    Bu kod satırını şu kodla değiştirin:

    await using ServiceBusSender sender = client.CreateSender(TopicName);
    
  5. bloğunda try...catch aşağıdaki kod satırını bulun:

    // Create and send a message here
    

    Bu kod satırını şu kodla değiştirin:

    string messageBody = "Total sales for Brazil in August: $13m.";
    var message = new ServiceBusMessage(messageBody);
    
  6. konsolda iletiyi görüntülemek için sonraki satıra aşağıdaki kodu ekleyin:

    Console.WriteLine($"Sending message: {messageBody}");
    
  7. İletiyi konuya göndermek için sonraki satıra aşağıdaki kodu ekleyin:

    await sender.SendMessageAsync(message);
    
  8. Son kodunuzun aşağıdaki örneğe benzediğini denetleyin:

    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. Değişikliklerinizi kaydetmek için Ctrl+S tuşlarına basın ve düzenleyiciyi kapatmak için Ctrl+Q tuşlarına basın.

Konu başlığına bir ileti gönderme

  1. Satış hakkında ileti gönderen bileşeni çalıştırmak için Cloud Shell'de aşağıdaki komutu çalıştırın:

    dotnet run --project performancemessagesender
    
  2. Program yürütülürken Cloud Shell'de ileti gönderildiğini belirten bildirimleri izleyin. Uygulamayı her çalıştırdığınızda, konuya başka bir ileti eklenir ve her abonelik için bir kopya kullanılabilir duruma gelir.

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

Abonelik iletilerini almadan önce ileti sayısını denetleyin

öğesini gördüğünüzde Message was sent successfully, abonelikte Americas kaç ileti olduğunu görmek için aşağıdaki komutu çalıştırın. ad alanı-adını> Service Bus ad alanınızla değiştirmeyi <unutmayın.

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

komutunu ile EuropeAndAsia değiştirir Americas ve komutu yeniden çalıştırırsanız, her iki aboneliğin de aynı sayıda iletiye sahip olduğunu görürsünüz.

Aboneliğin konu iletisini almak için kod yazma

Satış performansı hakkındaki iletileri alan bileşeni oluşturmak için şu adımları tamamlayın:

  1. Düzenleyiciyi başlatmak için komutunu çalıştırın code . .

  2. Düzenleyicide performancemessagereceiver/Program.cs dosyasını açın ve aşağıdaki kod satırını bulun:

    const string ServiceBusConnectionString = "";
    

    Tırnak işaretleri arasına, önceki alıştırmada kaydettiğiniz bağlantı dizesi yapıştırın.

  3. Service Bus istemcisi oluşturmak için yöntemini bulun MainAsync() . Bu yöntemin içinde aşağıdaki kod satırını bulun:

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

    Satırı şu kodla değiştirin:

    var client = new ServiceBusClient(ServiceBusConnectionString);
    
  4. İleti işleme seçeneklerini yapılandırmak için aşağıdaki kod satırını bulun:

    // Create the options to use for configuring the processor
    

    Satırı şu kodla değiştirin:

    var processorOptions = new ServiceBusProcessorOptions
    {
        MaxConcurrentCalls = 1,
        AutoCompleteMessages = false
    };
    
  5. İşlemci oluşturmak için aşağıdaki kod satırını bulun:

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

    Satırı şu kodla değiştirin:

    ServiceBusProcessor processor = client.CreateProcessor(TopicName, SubscriptionName, processorOptions);
    
  6. İşleyiciyi yapılandırmak için aşağıdaki kod satırını bulun:

    // Configure the message and error handler to use
    

    Satırı şu kodla değiştirin:

    processor.ProcessMessageAsync += MessageHandler;
    processor.ProcessErrorAsync += ErrorHandler;
    
  7. İşlemeye başlamak için aşağıdaki kod satırını bulun:

    // Start processing
    

    Satırı şu kodla değiştirin:

    await processor.StartProcessingAsync();
    
  8. Aşağıdaki kod satırını arayın:

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

    satırını şu kodla değiştirin:

    await processor.DisposeAsync();
    await client.DisposeAsync();    
    
  9. Konsolda gelen iletileri görüntülemek için yöntemini bulun MessageHandler() . Gelen iletileri işlemek için bu yöntemi kaydettiniz.

    Bu yöntemdeki tüm kodu aşağıdaki kodla değiştirin:

    Console.WriteLine($"Received message: SequenceNumber:{args.Message.SequenceNumber} Body:{args.Message.Body}");
    
  10. Alınan iletiyi abonelikten kaldırmak için, bir sonraki satırda aşağıdaki kodu ekleyin:

    await args.CompleteMessageAsync(args.Message);
    
  11. Son kodunuzun aşağıdaki örneğe benzediğini denetleyin:

    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. Değişikliklerinizi kaydetmek için Ctrl+S tuşlarına basın ve düzenleyiciyi kapatmak için Ctrl+Q tuşlarına basın.

Abonelik için konu iletisi alma

  1. Aboneliğin satış performansı hakkında bir ileti alan bileşeni çalıştırmak için aşağıdaki komutu çalıştırın:

    dotnet run --project performancemessagereceiver
    

    Aşağıdaki örneğe benzer bir çıktı görürsünüz:

    Received message: SequenceNumber:1 Body:Total sales for Brazil in August: $13m.
    
  2. Program iletileri aldığına ilişkin bildirimler döndürdükten sonra uygulamayı durdurmak için Enter tuşuna basın.

Abonelik için bir ileti aldıktan sonra ileti sayısını denetleyin

Abonelikte kalan ileti Americas olmadığını onaylamak için aşağıdaki komutu çalıştırın. ad alanı-adını> Service Bus ad alanınızla değiştirmeyi <unutmayın.

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

Aboneliğin geçerli ileti sayısını görmek için EuropeAndAsia değerini bu kodda ile EuropeAndAsia değiştirirsenizAmericas, ileti sayısının olduğunu 1görürsünüz. Önceki kodda, yalnızca Americas konu iletilerini alacak şekilde ayarlanmıştı, böylece ileti hala almak için EuropeAndAsia bekliyor.