Alıştırma - Kuyruk kullanarak ileti gönderme ve alma

Tamamlandı

Bir Service Bus kuyruğu kullanarak satış personelinizin kullandığı mobil uygulama ile Azure'da barındırılan web hizmeti arasındaki tek tek satışlarla ilgili iletileri işlemeyi seçtiniz ve her satışla ilgili ayrıntıları bir Azure SQL Veritabanı örneğinde depoladiniz.

Önceki alıştırmada, Azure aboneliğinizde gerekli nesneleri uyguladınız. Şimdi bu kuyruğa ileti gönderen ve iletileri alan kodu yazmak istiyorsunuz.

Bu ünitede iki konsol uygulaması oluşturacaksınız: bir uygulama iletileri Service Bus kuyruğuna yerleştirir ve bir uygulama service Bus kuyruğundan iletileri alır. Uygulamalar, tek bir .NET Core çözümünün parçasıdır.

Service Bus ad alanına bağlantı dizesi alma

Service Bus ad alanınıza erişmek ve bu ad alanı içindeki kuyruğu kullanmak için iki konsol uygulamanızda iki bilgi parçası yapılandırmanız gerekir:

  • Ad alanınız için uç nokta
  • Kimlik doğrulaması için paylaşılan erişim anahtarı

Bu değerleri bağlantı dizesi alabilirsiniz.

  1. Sağdaki Azure Cloud Shell'de aşağıdaki komutu çalıştırın ve değerini son alıştırmada oluşturduğunuz Service Bus ad alanıyla değiştirin <namespace-name> .

    az servicebus namespace authorization-rule keys list \
        --resource-group <rgn>[sandbox resource group name]</rgn> \
        --name RootManageSharedAccessKey \
        --query primaryConnectionString \
        --output tsv \
        --namespace-name <namespace-name>
    

    Yanıttaki son satır, ad alanınızın uç noktasını ve paylaşılan erişim anahtarını içeren bağlantı dizesi. Aşağıdaki örneğe benzemelidir:

    Endpoint=sb://example.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=AbCdEfGhIjKlMnOpQrStUvWxYz==
    
  2. Cloud Shell'den bağlantı dizesi kopyalayın. Bu modül boyunca bu bağlantı dizesi birkaç kez ihtiyacınız olacak, bu nedenle kullanışlı bir yere kaydetmek isteyebilirsiniz.

Başlangıç uygulamasını kopyalama ve açma

Dekont

Kolaylık olması için aşağıdaki görevler, her iki konsol uygulamasının Program.cs dosyasındaki bağlantı dizesi sabit kod yazmanızı gerektirir. Bir üretim uygulamasında, bağlantı dizesi depolamak için bir yapılandırma dosyası veya Azure Key Vault kullanmanız gerekir.

  1. Cloud Shell'de aşağıdaki komutu çalıştırarak Git proje çözümünü kopyalayın:

    cd ~
    git clone https://github.com/MicrosoftDocs/mslearn-connect-services-together.git
    
  2. Aşağıdaki komutu çalıştırarak kopyalanan projenizdeki başlangıç klasörüne gidin ve Cloud Shell düzenleyicisini açın:

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

Kuyruğa ileti göndermek için kod yazma

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

    const string ServiceBusConnectionString = "";
    

    Bağlantı dizesini tırnak işaretlerinin arasına yapıştırın.

  2. Kuyruk adı için salesmessages'dan farklı bir ad kullandıysanız koddaki özelliğin değerini QueueName güncelleştirin:

    const string QueueName = "salesmessages";
    
  3. Satışlar hakkında ileti gönderen bileşeni tamamlamak için, zaman uyumsuz işlem tamamlanana kadar zaman uyumsuz yöntemin değerlendirmesini askıya almak için bir await işleç eklemeniz gerekir. SendSalesMessageAsync() yöntemini bulun. Bu yöntemin içinde aşağıdaki kod satırını bulun:

    // Create a Service Bus client here
    

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

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

    // Create a sender here
    

    Bu açıklamayı aşağıdaki kodla değiştirin:

    await using ServiceBusSender sender = client.CreateSender(QueueName);
    
  5. Bloğun içinde try...catch aşağıdaki kod satırını bulun:

    // Create and send a message here
    

    Bu kod satırını aşağıdaki kod satırlarıyla değiştirin:

    string messageBody = $"$10,000 order for bicycle parts from retailer Adventure Works.";
    var message = new ServiceBusMessage(messageBody);
    
  6. Konsolda iletiyi görüntülemek için yeni eklediğiniz kodun hemen altına yeni bir satıra aşağıdaki kodu ekleyin:

    Console.WriteLine($"Sending message: {messageBody}");
    
  7. Sonraki satıra aşağıdaki kodu ekleyin:

    await sender.SendMessageAsync(message);
    
  8. Gönderen ve istemci nesnelerini atmak için dosyanın sonuna yakın bir şekilde aşağıdaki açıklamayı bulun:

    // Close the connection to the sender here
    

    Bu satırı aşağıdaki kodla değiştirin:

    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();
    }
    
  9. privatemessagesender/Program.cs için son kodunuzun aşağıdaki örneğe benzediğini denetleyin:

    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=AbCdEfGhIjKlMnOpQrStUvWxYz==";
            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();
                }
            }
        }
    }
    
  10. 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.

Kuyruğa ileti gönderme

  1. Cloud Shell'de aşağıdaki komutu çalıştırarak satışla ilgili bir ileti gönderin. İlk satır doğru yolda olduğunuzdan emin olun.

    cd ~/mslearn-connect-services-together/implement-message-workflows-with-service-bus/src/start
    dotnet run --project ./privatemessagesender
    

    Dekont

    Bu alıştırmada uygulamaları ilk kez çalıştırdığınızda, uzak kaynaklardan paketleri geri yükleyip uygulamaları derlemeye izin verin dotnet .

    Program çalışırken, uygulamanın bir ileti gönderdiğini belirten iletiler konsola yazdırılır:

    Sending a message to the Sales Messages queue...
    Sending message: $10,000 order for bicycle parts from retailer Adventure Works.
    Message was sent successfully.
    
  2. Uygulama tamamlandığında aşağıdaki komutu çalıştırın ve ad alanı-adını> Service Bus ad alanınızın adıyla değiştirin<. Bu komut, kuyruktaki iletilerin sayısını döndürür.

    az servicebus queue show \
        --resource-group <rgn>[sandbox resource group name]</rgn> \
        --name salesmessages \
        --query messageCount \
        --namespace-name <namespace-name>
    
  3. dotnet run 1. adımdaki komutu yeniden çalıştırın ve ardından komutu yeniden çalıştırınservicebus queue show. dotnet uygulamasını her çalıştırdığınızda kuyruğa yeni bir ileti eklenir. Azure komutunu her çalıştırdığınızda messageCount artışı görürsünüz.

Kuyruktan ileti almak için kod yazma

  1. Düzenleyiciyi yeniden açmak için aşağıdaki komutu çalıştırın:

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

    const string ServiceBusConnectionString = "";
    

    Tırnak işaretlerinin arasına, daha önce kaydettiğiniz bağlantı dizesi yapıştırın.

  3. ReceiveSalesMessageAsync() yöntemini bulun. 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
    

    Bu satırı aşağıdaki 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
    

    Bu satırı aşağıdaki kod satırlarıyla 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
    

    Bu satırı aşağıdaki kodla değiştirin:

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

    // Configure the message and error handler to use
    

    Bu satırı aşağıdaki 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
    

    Bu satırı aşağıdaki kodla değiştirin:

    await processor.StartProcessingAsync();
    
  8. Service Bus bağlantısını kapatmak için aşağıdaki kod satırını bulun:

    // Close the processor here
    

    Bu satırı aşağıdaki kodla değiştirin:

    await processor.CloseAsync();
    
  9. Yöntemindeki MessageHandler kodu gözden geçirin:

    // 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. Yöntemindeki ErrorHandler kodu gözden geçirin:

    // handle any errors when receiving messages
    static Task ErrorHandler(ProcessErrorEventArgs args)
    {
        // print the exception message
        Console.WriteLine(args.Exception.ToString());
        return Task.CompletedTask;
    }    
    
  11. privatemessagereceiver/Program.cs için son kodunuzun aşağıdaki örneğe benzediğini denetleyin:

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

Kuyruktan ileti alma

  1. Satış hakkında ileti alan bileşeni çalıştırmak için Cloud Shell'de şu komutu çalıştırın:

    dotnet run --project privatemessagereceiver
    
  2. Cloud Shell'de bildirimleri denetleyin. Azure portalında Service Bus ad alanınıza gidin ve İletiler grafiğinizi denetleyin:

    Received: $10,000 order for bicycle parts from retailer Adventure Works.
    
  3. İletilerin Cloud Shell'de alındığını gördüğünüzde, uygulamayı durdurmak için Enter tuşuna basın.

İleti sayısını denetleme

Tüm iletilerin kuyruktan kaldırıldığını onaylamak için aşağıdaki kodu çalıştırın ve ad alanı-adını Service Bus ad> alanınızla değiştirmeyi <unutmayın.

az servicebus queue show \
    --resource-group <rgn>[sandbox resource group name]</rgn> \
    --name salesmessages \
    --query messageCount \
    --namespace-name <namespace-name>

Çıkış, tüm iletiler kaldırılmışsa olacaktır 0 .

Service Bus kuyruğuna tek tek satışlar hakkında ileti gönderen bir kod yazdınız. Salesforce dağıtılmış uygulamasında, satış personelinin cihazlarda kullandığı mobil uygulamaya bu kodu yazmanız gerekir.

Service Bus kuyruğundan bir ileti alan kod da yazdınız. Salesforce dağıtılmış uygulamasında, bu kodu Azure'da çalışan ve alınan iletileri işleyen web hizmetine yazmanız gerekir.