Azure Service Bus 큐에서 메시지 보내기 및 받기(.NET)Send messages to and receive messages from Azure Service Bus queues (.NET)

이 자습서에서는 Azure.Messaging.ServiceBus 패키지를 사용하여 Azure Service Bus 큐에서 메시지를 보내고 받는 .NET Core 콘솔 애플리케이션을 만듭니다.In this tutorial, you create a .NET Core console application to send messages to and receive messages from a Service Bus queue using the Azure.Messaging.ServiceBus package.

중요

이 빠른 시작에서는 새 Azure.Messaging.ServiceBus 패키지를 사용합니다.This quickstart uses the new Azure.Messaging.ServiceBus package. 이전 Microsoft.Azure.ServiceBus 패키지를 사용하는 빠른 시작은 Microsoft.Azure.ServiceBus 패키지를 사용하여 이벤트 보내기 및 받기를 참조하세요.For a quickstart that uses the old Microsoft.Azure.ServiceBus package, see Send and receive events using Microsoft.Azure.ServiceBus package.

사전 요구 사항Prerequisites

큐에 메시지 보내기Send messages to a queue

이 빠른 시작에서는 메시지를 큐에 보내는 C# .NET Core 콘솔 애플리케이션을 만듭니다.In this quick start, you'll create a C# .NET Core console application to send messages to the queue.

콘솔 애플리케이션 만들기Create a console application

Visual Studio를 시작하고, C#용 새 콘솔 앱(.NET Core) 프로젝트를 만듭니다.Launch Visual Studio and create a new Console App (.NET Core) project for C#.

Service Bus NuGet 패키지 추가Add the Service Bus NuGet package

  1. 마우스 오른쪽 단추로 새롭게 만든 프로젝트를 클릭하고 NuGet 패키지 관리 를 선택합니다.Right-click the newly created project and select Manage NuGet Packages.
  2. 찾아보기 를 선택합니다.Select Browse. Azure.Messaging.ServiceBus 를 검색하여 선택합니다.Search for and select Azure.Messaging.ServiceBus.
  3. 설치 를 선택하여 설치를 완료한 다음, NuGet 패키지 관리자를 닫습니다.Select Install to complete the installation, then close the NuGet Package Manager.

메시지를 큐에 보내는 코드 추가Add code to send messages to the queue

  1. Program.cs 의 네임스페이스 정의 위쪽에서 다음 using 문을 클래스 선언 앞에 추가합니다.In Program.cs, add the following using statements at the top of the namespace definition, before the class declaration:

    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    using Azure.Messaging.ServiceBus;
    
  2. Program 클래스에서 다음 변수를 선언합니다.In the Program class, declare the following variables:

        static string connectionString = "<NAMESPACE CONNECTION STRING>";
        static string queueName = "<QUEUE NAME>";
    

    네임스페이스에 대한 연결 문자열을 connectionString 변수로 입력합니다.Enter your connection string for the namespace as the connectionString variable. 큐 이름을 입력합니다.Enter your queue name.

  3. Main() 메서드 바로 뒤에 메시지 전송 작업을 수행하는 다음 SendMessagesAsync() 메서드를 추가합니다.Directly after the Main() method, add the following SendMessagesAsync() method that does the work of sending a message:

        static async Task SendMessageAsync()
        {
            // create a Service Bus client 
            await using (ServiceBusClient client = new ServiceBusClient(connectionString))
            {
                // create a sender for the queue 
                ServiceBusSender sender = client.CreateSender(queueName);
    
                // create a message that we can send
                ServiceBusMessage message = new ServiceBusMessage("Hello world!");
    
                // send the message
                await sender.SendMessageAsync(message);
                Console.WriteLine($"Sent a single message to the queue: {queueName}");
            }
        }
    
  4. 메시지의 큐(.NET 큐)를 만드는 CreateMessages라는 메서드를 Program 클래스에 추가합니다.Add a method named CreateMessages to create a queue (.NET queue) of messages to the Program class. 일반적으로 이러한 메시지는 애플리케이션의 여러 부분에서 가져옵니다.Typically, you get these messages from different parts of your application. 여기서는 샘플 메시지의 큐를 만듭니다.Here, we create a queue of sample messages.

        static Queue<ServiceBusMessage> CreateMessages()
        {
            // create a queue containing the messages and return it to the caller
            Queue<ServiceBusMessage> messages = new Queue<ServiceBusMessage>();
            messages.Enqueue(new ServiceBusMessage("First message in the batch"));
            messages.Enqueue(new ServiceBusMessage("Second message in the batch"));
            messages.Enqueue(new ServiceBusMessage("Third message in the batch"));
            return messages;
        }
    
  5. SendMessageBatchAsync라는 메서드를 Program 클래스에 추가하고, 다음 코드를 추가합니다.Add a method named SendMessageBatchAsync to the Program class, and add the following code. 이 메서드는 메시지의 큐를 사용하고, Service Bus 큐로 보낼 하나 이상의 일괄 처리를 준비합니다.This method takes a queue of messages, and prepares one or more batches to send to the Service Bus queue.

        static async Task SendMessageBatchAsync()
        {
            // create a Service Bus client 
            await using (ServiceBusClient client = new ServiceBusClient(connectionString))
            {
                // create a sender for the queue 
                ServiceBusSender sender = client.CreateSender(queueName);
    
                // get the messages to be sent to the Service Bus queue
                Queue<ServiceBusMessage> messages = CreateMessages();
    
                // total number of messages to be sent to the Service Bus queue
                int messageCount = messages.Count;
    
                // while all messages are not sent to the Service Bus queue
                while (messages.Count > 0)
                {
                    // start a new batch 
                    using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
    
                    // add the first message to the batch
                    if (messageBatch.TryAddMessage(messages.Peek()))
                    {
                        // dequeue the message from the .NET queue once the message is added to the batch
                        messages.Dequeue();
                    }
                    else
                    {
                        // if the first message can't fit, then it is too large for the batch
                        throw new Exception($"Message {messageCount - messages.Count} is too large and cannot be sent.");
                    }
    
                    // add as many messages as possible to the current batch
                    while (messages.Count > 0 && messageBatch.TryAddMessage(messages.Peek()))
                    {
                        // dequeue the message from the .NET queue as it has been added to the batch
                        messages.Dequeue();
                    }
    
                    // now, send the batch
                    await sender.SendMessagesAsync(messageBatch);
    
                    // if there are any remaining messages in the .NET queue, the while loop repeats 
                }
    
                Console.WriteLine($"Sent a batch of {messageCount} messages to the topic: {queueName}");
            }
        }
    
  6. Main() 메서드를 다음 async Main 메서드로 바꿉니다.Replace the Main() method with the following async Main method. 이 메서드는 단일 메시지 및 메시지 일괄 처리를 큐로 보내는 send 메서드를 모두 호출합니다.It calls both the send methods to send a single message and a batch of messages to the queue.

        static async Task Main()
        {
            // send a message to the queue
            await SendMessageAsync();
    
            // send a batch of messages to the queue
            await SendMessageBatchAsync();
        }
    
  7. 애플리케이션을 실행합니다.Run the application. 다음과 같은 메시지가 표시됩니다.You should see the following messages.

    Sent a single message to the queue: myqueue
    Sent a batch of messages to the queue: myqueue
    
  8. Azure Portal에서 다음 단계를 수행합니다.In the Azure portal, follow these steps:

    1. Service Bus 네임스페이스로 이동합니다.Navigate to your Service Bus namespace.
    2. 개요 페이지의 아래쪽 가운데 창에서 큐를 선택합니다.On the Overview page, select the queue in the bottom-middle pane.
    3. 기본 정보 섹션의 값을 확인합니다.Notice the values in the Essentials section.

    개수 및 크기와 함께 받은 메시지

    다음 값을 확인합니다.Notice the following values:

    • 큐에 대한 활성 메시지 수 값은 이제 4 입니다.The Active message count value for the queue is now 4. 메시지를 검색하지 않고 이 보낸 사람 앱을 실행할 때마다 이 값이 4씩 증가합니다.Each time you run this sender app without retrieving the messages, this value increases by 4.
    • 앱에서 메시지를 큐에 추가할 때마다 큐의 현재 크기는 기본 정보현재 값을 증가시킵니다.The current size of the queue increments the CURRENT value in Essentials each time the app adds messages to the queue.
    • 아래쪽 메트릭 섹션의 메시지 차트에서 해당 큐에 대해 4개의 들어오는 메시지가 있음을 확인할 수 있습니다.In the Messages chart in the bottom Metrics section, you can see that there are four incoming messages for the queue.

큐에서 메시지 받기Receive messages from a queue

이 섹션에서는 큐에서 메시지를 검색하는 코드를 추가합니다.In this section, you'll add code to retrieve messages from the queue.

  1. 메시지 및 오류를 처리하는 다음 메서드를 Program 클래스에 추가합니다.Add the following methods to the Program class that handle messages and any errors.

        // 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;
        }
    
  2. ReceiveMessagesAsync라는 메서드를 Program 클래스에 추가하고, 메시지를 받는 다음 코드를 추가합니다.Add a method named ReceiveMessagesAsync to the Program class, and add the following code to receive messages.

        static async Task ReceiveMessagesAsync()
        {
            await using (ServiceBusClient client = new ServiceBusClient(connectionString))
            {
                // create a processor that we can use to process the messages
                ServiceBusProcessor processor = client.CreateProcessor(queueName, new ServiceBusProcessorOptions());
    
                // add handler to process messages
                processor.ProcessMessageAsync += MessageHandler;
    
                // add handler to process any errors
                processor.ProcessErrorAsync += ErrorHandler;
    
                // start processing 
                await processor.StartProcessingAsync();
    
                Console.WriteLine("Wait for a minute and then press any key to end the processing");
                Console.ReadKey();
    
                // stop processing 
                Console.WriteLine("\nStopping the receiver...");
                await processor.StopProcessingAsync();
                Console.WriteLine("Stopped receiving messages");
            }
        }
    
  3. Main 메서드에서 ReceiveMessagesAsync 메서드에 대한 호출을 추가합니다.Add a call to ReceiveMessagesAsync method from the Main method. 메시지 수신만 테스트하려면 SendMessagesAsync 메서드를 주석으로 처리합니다.Comment out the SendMessagesAsync method if you want to test only receiving of messages. 그렇지 않으면 큐로 보낸 다른 4개의 메시지가 표시됩니다.If you don't, you see another four messages sent to the queue.

        static async Task Main()
        {
            // send a message to the queue
            await SendMessageAsync();
    
            // send a batch of messages to the queue
            await SendMessageBatchAsync();
    
            // receive message from the queue
            await ReceiveMessagesAsync();
        }
    

앱 실행Run the app

애플리케이션을 실행합니다.Run the application. 잠시 기다린 다음, 아무 키나 눌러 메시지 수신을 중지합니다.Wait for a minute and then press any key to stop receiving messages. 다음 출력이 표시됩니다(스페이스바 키 사용).You should see the following output (spacebar for the key).

Sent a single message to the queue: myqueue
Sent a batch of messages to the queue: myqueue
Wait for a minute and then press any key to end the processing
Received: Hello world!
Received: First message in the batch
Received: Second message in the batch
Received: Third message in the batch
Received: Hello world!
Received: First message in the batch
Received: Second message in the batch
Received: Third message in the batch

Stopping the receiver...
Stopped receiving messages

포털을 다시 확인합니다.Check the portal again.

  • 활성 메시지 수현재 값은 이제 0 입니다.The Active message count and CURRENT values are now 0.

  • 아래쪽 메트릭 섹션의 메시지 차트에서 해당 큐에 대해 8개의 들어오는 메시지와 8개의 나가는 메시지가 있음을 확인할 수 있습니다.In the Messages chart in the bottom Metrics section, you can see that there are eight incoming messages and eight outgoing messages for the queue.

    받은 후의 활성 메시지 수 및 크기

다음 단계Next steps

다음 설명서와 샘플을 참조하세요.See the following documentation and samples: