Azure Service Bus 토픽에 메시지 보내기 및 토픽의 구독에서 메시지 받기(.NET)Send messages to an Azure Service Bus topic and receive messages from subscriptions to the topic (.NET)

이 자습서에서는 다음 작업을 수행하는 C# 애플리케이션을 만듭니다.In this tutorial, you create a C# application to do the following tasks:

  1. Service Bus 항목에 메시지를 보냅니다.Send messages to a Service Bus topic.

    Service Bus 항목은 보낸 사람 엔드포인트에서 메시지를 보낼 수 있는 엔드포인트를 제공합니다.A Service Bus topic provides an endpoint for sender applications to send messages. 토픽은 하나 이상의 구독을 가질 수 있습니다.A topic can have one or more subscriptions. 토픽의 각 구독은 토픽에 전송된 메시지의 복사본을 가져옵니다.Each subscription of a topic gets a copy of the message sent to the topic. Service Bus 토픽에 대한 자세한 내용은 Azure Service Bus란?을 참조하세요.For more information about Service Bus topics, see What is Azure Service Bus?.

  2. 토픽의 구독에서 메시지 받기.Receive messages from a subscription of the topic.

    Service Bus 토픽 및 구독

    중요

    이 빠른 시작에서는 새 Azure.Messaging.ServiceBus 패키지를 사용합니다.This quickstart uses the new Azure.Messaging.ServiceBus package. 이전 Microsoft.Azure.ServiceBus 패키지를 사용하는 경우 Microsoft.Azure.ServiceBus 패키지를 사용하여 메시지 보내기 및 받기를 참조하세요.If you are using the old Microsoft.Azure.ServiceBus package, see Send and receive messages using the Microsoft.Azure.ServiceBus package.

필수 구성 요소Prerequisites

  • Azure 구독An Azure subscription. 이 자습서를 완료하려면 Azure 계정이 필요합니다.To complete this tutorial, you need an Azure account. Visual Studio 또는 MSDN 구독자 혜택을 활성화해도 되고, 또는 체험 계정에 가입해도 됩니다.You can activate your Visual Studio or MSDN subscriber benefits or sign-up for a free account.

  • 빠른 시작의 단계를 따라 Service Bus 토픽 및 해당 토픽에 대한 구독을 만듭니다.Follow steps in this Quickstart to create a Service Bus topic and subscriptions to the topic.

    참고

    네임스페이스에 대한 연결 문자열, 토픽 이름 및 이 자습서의 토픽에 대한 구독 중 하나의 이름을 사용합니다.You will use the connection string to the namespace, the topic name, and the name of one of the subscriptions to the topic in this tutorial.

  • Visual Studio 2019.Visual Studio 2019.

토픽에 메시지 보내기Send messages to a topic

이 섹션에서는 Visual Studio에서 .NET Core 콘솔 애플리케이션을 만들고, 만든 Service Bus 토픽에 메시지를 보내는 코드를 추가합니다.In this section, you'll create a .NET Core console application in Visual Studio, add code to send messages to the Service Bus topic you created.

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

Visual Studio를 사용하여 .NET Core 콘솔 애플리케이션 만들기.Create a .NET Core console application using Visual Studio.

  1. Visual Studio를 실행합니다.Launch Visual Studio.
  2. 시작 페이지가 표시되면 새 프로젝트 만들기 를 선택합니다.If you see the Get started page, select Create a new project.
  3. 새 프로젝트 만들기 페이지에서 다음 단계를 수행합니다.On the Create a new project page, follow these steps:
    1. 프로그래밍 언어에서 C# 을 선택합니다.For the programming language, select C#.

    2. 프로젝트 형식에서 콘솔 을 선택합니다.For the project type, select Console.

    3. 템플릿 목록에서 콘솔 앱(.NET Core) 을 선택합니다.Select Console App (.NET Core) from the list of templates.

    4. 그다음에 다음 을 선택합니다.Then, select Next.

      콘솔 앱 프로젝트 만들기

  4. 새 프로젝트 구성 페이지에서 이 단계를 수행합니다.On the Configure your new project page, follow these steps:
    1. 프로젝트 이름 에 프로젝트의 이름을 입력합니다.For Project name, enter a name for the project.

    2. 위치 에서 프로젝트 및 솔루션 파일의 위치를 선택합니다.For Location, select a location for the project and solution files.

    3. 솔루션 이름 에서 솔루션의 이름을 입력합니다.For Solution name, enter a name for the solution. Visual Studio 솔루션에는 하나 이상의 프로젝트가 포함될 수 있습니다.A Visual Studio solution can have one or more projects. 이 빠른 시작에서 솔루션에는 프로젝트가 하나만 있습니다.In this quick start, the solution will have only one project.

    4. 만들기 를 선택하여 프로젝트를 만듭니다.Select Create to create the project.

      프로젝트 및 솔루션 이름 및 위치 입력

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

  1. 마우스 오른쪽 단추로 새롭게 만든 프로젝트를 클릭하고 NuGet 패키지 관리 를 선택합니다.Right-click the newly created project and select Manage NuGet Packages.

    NuGet 패키지 관리 메뉴

  2. 찾아보기 탭으로 전환합니다.Switch to the Browse tab.

  3. Azure.Messaging.ServiceBus 를 검색하여 선택합니다.Search for and select Azure.Messaging.ServiceBus.

  4. 설치 을 선택하여 설치를 완료합니다.Select Install to complete the installation.

    Service Bus NuGet 패키지를 선택합니다.

  5. 변경 내용 미리 보기 대화 상자가 표시되면 확인 을 선택하여 계속합니다.If you see the Preview Changes dialog box, select OK to continue.

  6. 라이선스 승인 페이지가 표시되면 동의함 을 선택하여 계속합니다.If you see the License Acceptance page, select I Accept to continue.

코드를 추가하여 토픽에 메시지 보내기Add code to send messages to the topic

  1. 솔루션 탐색기 창에서 Program.cs 를 두 번 클릭하여 편집기에서 파일을 엽니다.In the Solution Explorer window, double-click Program.cs to open the file in the editor.

  2. 클래스 선언 앞에 네임스페이스 정의 맨 위에 다음 using 문을 추가합니다.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;
    
  3. Program 클래스에서 Main 함수 위에 다음 변수를 선언합니다.In the Program class, above the Main function, declare the following variables:

        static string connectionString = "<NAMESPACE CONNECTION STRING>";
        static string topicName = "<SERVICE BUS TOPIC NAME>";
        static string subscriptionName = "<SERVICE BUS - TOPIC SUBSCRIPTION NAME>";
    

    다음 값을 바꿉니다.Replace the following values:

    • <NAMESPACE CONNECTION STRING>을 Service Bus 네임스페이스에 대한 연결 문자열로 바꿉니다.<NAMESPACE CONNECTION STRING> with the connection string to your Service Bus namespace
    • <TOPIC NAME>을 토픽 이름으로 바꿉니다.<TOPIC NAME> with the name of the topic
    • <SUBSCRIPTION NAME>을 구독 이름으로 바꿉니다.<SUBSCRIPTION NAME> with the name of the subscription

토픽에 단일 메시지 보내기Send a single message to the topic

SendMessageToTopicAsync라는 메서드를 Main 메서드의 위 또는 아래에 있는 Program 클래스에 추가합니다.Add a method named SendMessageToTopicAsync to the Program class above or below the Main method. 이 메서드는 토픽에 단일 메시지를 보냅니다.This method sends a single message to the topic.

    static async Task SendMessageToTopicAsync()
    {
        // create a Service Bus client 
        await using (ServiceBusClient client = new ServiceBusClient(connectionString))
        {
            // create a sender for the topic
            ServiceBusSender sender = client.CreateSender(topicName);
            await sender.SendMessageAsync(new ServiceBusMessage("Hello, World!"));
            Console.WriteLine($"Sent a single message to the topic: {topicName}");
        }
    }

이 메서드는 다음 단계를 수행합니다.This method does the following steps:

  1. 네임스페이스에 대한 연결 문자열을 사용하여 ServiceBusClient 개체를 만듭니다.Creates a ServiceBusClient object using the connection string to the namespace.
  2. ServiceBusClient 개체를 사용하여 지정된 Service Bus 항목에 대한 ServiceBusSender 개체를 만듭니다.Uses the ServiceBusClient object to create a ServiceBusSender object for the specified Service Bus topic. 이 단계는 ServiceBusClient.CreateSender 메서드를 사용합니다.This step uses the ServiceBusClient.CreateSender method.
  3. 그런 다음, 이 메서드는 ServiceBusSender.SendMessageAsync 메서드를 사용하여 단일 테스트 메시지를 Service Bus 토픽으로 보냅니다.Then, the method sends a single test message to the Service Bus topic using the ServiceBusSender.SendMessageAsync method.

메시지 일괄 처리를 토픽에 보내기Send a batch of messages to the topic

  1. Program 클래스에 메시지 큐(Service Bus 큐가 아닌 .NET 큐)를 만들려면 CreateMessages라는 메서드를 추가합니다.Add a method named CreateMessages to create a queue (.NET queue, not Service Bus 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. .NET 큐에 익숙하지 않은 경우 Queue.Enqueue를 참조하세요.If you aren't familiar with .NET queues, see Queue.Enqueue.

        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"));
            messages.Enqueue(new ServiceBusMessage("Second message"));
            messages.Enqueue(new ServiceBusMessage("Third message"));
            return messages;
        }
    
  2. SendMessageBatchAsync라는 메서드를 Program 클래스에 추가하고, 다음 코드를 추가합니다.Add a method named SendMessageBatchAsync 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 topic.

        static async Task SendMessageBatchToTopicAsync()
        {
            // create a Service Bus client 
            await using (ServiceBusClient client = new ServiceBusClient(connectionString))
            {
    
                // create a sender for the topic 
                ServiceBusSender sender = client.CreateSender(topicName);
    
                // get the messages to be sent to the Service Bus topic
                Queue<ServiceBusMessage> messages = CreateMessages();
    
                // total number of messages to be sent to the Service Bus topic
                int messageCount = messages.Count;
    
                // while all messages are not sent to the Service Bus topic
                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: {topicName}");
            }
        }
    

    다음은 코드의 중요한 단계입니다.Here are the important steps from the code:

    1. 네임스페이스에 대한 연결 문자열을 사용하여 ServiceBusClient 개체를 만듭니다.Creates a ServiceBusClient object using the connection string to the namespace.
    2. ServiceBusClient 개체에서 CreateSender 메서드를 호출하여 지정된 Service Bus 토픽에 대한 ServiceBusSender 개체를 만듭니다.Invokes the CreateSender method on the ServiceBusClient object to create a ServiceBusSender object for the specified Service Bus topic.
    3. 도우미 메서드 GetMessages를 호출하여 Service Bus 토픽으로 보낼 메시지 큐를 가져옵니다.Invokes the helper method GetMessages to get a queue of messages to be sent to the Service Bus topic.
    4. ServiceBusSender.CreateMessageBatchAsync를 사용하여 ServiceBusMessageBatch를 만듭니다.Creates a ServiceBusMessageBatch by using the ServiceBusSender.CreateMessageBatchAsync.
    5. ServiceBusMessageBatch.TryAddMessage를 사용하여 일괄 처리에 메시지를 추가합니다.Add messages to the batch using the ServiceBusMessageBatch.TryAddMessage. 메시지가 일괄 처리에 추가되면 .NET 큐에서 제거됩니다.As the messages are added to the batch, they're removed from the .NET queue.
    6. ServiceBusSender.SendMessagesAsync 메서드를 사용하여 메시지 일괄 처리를 Service Bus 토픽에 보냅니다.Sends the batch of messages to the Service Bus topic using the ServiceBusSender.SendMessagesAsync method.

main 메서드 업데이트Update the main method

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

    static async Task Main()
    {
        // send a single message to the topic
        await SendMessageToTopicAsync();

        // send a batch of messages to the topic
        await SendMessageBatchToTopicAsync();
    }

앱을 테스트하여 메시지를 토픽에 보내기Test the app to send messages to the topic

  1. 애플리케이션을 실행합니다.Run the application. 다음과 같은 출력이 표시됩니다.You should see the following output:

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

    1. Service Bus 네임스페이스로 이동합니다.Navigate to your Service Bus namespace.

    2. 개요 페이지의 아래쪽 가운데 창에서 토픽 탭으로 전환하고, Service Bus 토픽을 선택합니다.On the Overview page, in the bottom-middle pane, switch to the Topics tab, and select the Service Bus topic. 다음 예에서는 mytopic입니다.In the following example, it's mytopic.

      항목 선택

    3. Service Bus 토픽 페이지 아래쪽의 메트릭 섹션에 있는 메시지 차트에서 해당 토픽에 대해 4개의 들어오는 메시지가 있음을 확인할 수 있습니다.On the Service Bus Topic page, In the Messages chart in the bottom Metrics section, you can see that there are four incoming messages for the topic. 값이 표시되지 않으면 몇 분 동안 기다렸다가 페이지를 새로 고쳐 업데이트된 차트를 확인합니다.If you don't see the value, wait for a few minutes and refresh the page to see the updated chart.

      토픽으로 보낸 메시지

    4. 아래쪽 창에서 구독을 선택합니다.Select the subscription in the bottom pane. 다음 예에서는 S1 입니다.In the following example, it's S1. Service Bus 구독 페이지에 활성 메시지 수4 로 표시됩니다.On the Service Bus Subscription page, you see the Active message count as 4. 구독에서 토픽으로 보낸 4개의 메시지를 받았지만 받는 사람이 아직 이를 선택하지 않았습니다.The subscription has received the four messages that you sent to the topic, but no receiver has picked them yet.

      구독에서 받은 메시지

구독에서 메시지 받기Receive messages from a subscription

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

        static async Task MessageHandler(ProcessMessageEventArgs args)
        {
            string body = args.Message.Body.ToString();
            Console.WriteLine($"Received: {body} from subscription: {subscriptionName}");
    
            // complete the message. messages is deleted from the queue. 
            await args.CompleteMessageAsync(args.Message);
        }
    
        static Task ErrorHandler(ProcessErrorEventArgs args)
        {
            Console.WriteLine(args.Exception.ToString());
            return Task.CompletedTask;
        }
    
  2. 다음 ReceiveMessagesFromSubscriptionAsync 메서드를 Program 클래스에 추가합니다.Add the following method ReceiveMessagesFromSubscriptionAsync to the Program class.

        static async Task ReceiveMessagesFromSubscriptionAsync()
        {
            await using (ServiceBusClient client = new ServiceBusClient(connectionString))
            {
                // create a processor that we can use to process the messages
                ServiceBusProcessor processor = client.CreateProcessor(topicName, subscriptionName, 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");
            }
        }
    

    다음은 코드의 중요한 단계입니다.Here are the important steps from the code:

    1. 네임스페이스에 대한 연결 문자열을 사용하여 ServiceBusClient 개체를 만듭니다.Creates a ServiceBusClient object using the connection string to the namespace.
    2. ServiceBusClient 개체에서 CreateProcessor 메서드를 호출하여 지정된 Service Bus 토픽 및 구독 조합에 대해 ServiceBusProcessor 개체를 생성합니다.Invokes the CreateProcessor method on the ServiceBusClient object to create a ServiceBusProcessor object for the specified Service Bus topic and the subscription combination.
    3. ServiceBusProcessor 개체의 ProcessMessageAsyncProcessErrorAsync 이벤트에 대한 처리기를 지정합니다.Specifies handlers for the ProcessMessageAsync and ProcessErrorAsync events of the ServiceBusProcessor object.
    4. ServiceBusProcessor 개체에서 StartProcessingAsync를 호출하여 메시지 처리를 시작합니다.Starts processing messages by invoking the StartProcessingAsync on the ServiceBusProcessor object.
    5. 사용자가 키를 눌러 처리를 종료하면 ServiceBusProcessor 객체에서 StopProcessingAsync를 호출합니다.When user presses a key to end the processing, invokes the StopProcessingAsync on the ServiceBusProcessor object.
  3. ReceiveMessagesFromSubscriptionAsync 메서드에 대한 호출을 Main 메서드에 추가합니다.Add a call to the ReceiveMessagesFromSubscriptionAsync method to the Main method. 메시지 수신만 테스트하려면 SendMessagesToTopicAsync 메서드를 주석으로 처리합니다.Comment out the SendMessagesToTopicAsync method if you want to test only receiving of messages. 그렇지 않으면 토픽으로 보낸 다른 4개의 메시지가 표시됩니다.If you don't, you see another four messages sent to the topic.

        static async Task Main()
        {
            // send a message to the topic
            await SendMessageToTopicAsync();
    
            // send a batch of messages to the topic
            await SendMessageBatchToTopicAsync();
    
            // receive messages from the subscription
            await ReceiveMessagesFromSubscriptionAsync();
        }
    

앱 실행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 topic: mytopic
Sent a batch of 3 messages to the topic: mytopic
Wait for a minute and then press any key to end the processing
Received: Hello, World! from subscription: mysub
Received: First message from subscription: mysub
Received: Second message from subscription: mysub
Received: Third message from subscription: mysub
Received: Hello, World! from subscription: mysub
Received: First message from subscription: mysub
Received: Second message from subscription: mysub
Received: Third message from subscription: mysub

Stopping the receiver...
Stopped receiving messages

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

  • Service Bus 토픽 페이지의 메시지 차트에 8개의 들어오는 메시지와 8개의 나가는 메시지가 표시됩니다.On the Service Bus Topic page, in the Messages chart, you see eight incoming messages and eight outgoing messages. 이러한 숫자가 표시되지 않으면 몇 분 동안 기다렸다가 페이지를 새로 고쳐 업데이트된 차트를 확인합니다.If you don't see these numbers, wait for a few minutes, and refresh the page to see the updated chart.

    보낸 메시지 및 받은 메시지

  • Service Bus 구독 페이지에 활성 메시지 수 가 0으로 표시됩니다.On the Service Bus Subscription page, you see the Active message count as zero. 받는 사람이 이 구독에서 메시지를 받고 메시지를 완료했기 때문입니다.It's because a receiver has received messages from this subscription and completed the messages.

    종료된 구독의 활성 메시지 수

다음 단계Next steps

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