Service Bus 큐 항목 시작Get started with Service Bus topics

이 자습서에서 다루는 단계는 다음과 같습니다.This tutorial covers the following steps:

  1. 항목에 일련의 메시지를 보내도록 .NET Core 콘솔 애플리케이션을 작성합니다.Write a .NET Core console application to send a set of messages to the topic.
  2. 구독에서 해당 메시지를 수신하도록 .NET Core 콘솔 애플리케이션을 작성합니다.Write a .NET Core console application to receive those messages from the subscription.

필수 조건Prerequisites

  1. 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.
  2. 단계를 수행 합니다 빠른 시작: Azure Portal을 사용하여 Service Bus 항목 및 해당 항목에 대한 하나 이상의 구독 만들기: 다음 작업을 수행합니다.Follow steps in the Quickstart: Use the Azure portal to create a Service Bus topic and subscriptions to the topic to do the following tasks:
    1. Service Bus를 만듭니다 네임 스페이스합니다.Create a Service Bus namespace.
    2. 가져오기의 연결 문자열합니다.Get the connection string.
    3. 만들기는 항목 네임 스페이스에 있습니다.Create a topic in the namespace.
    4. 만들 구독 네임 스페이스에서 항목을 합니다.Create one subscription to the topic in the namespace.
  3. Visual Studio 2017 업데이트 3(버전 15.3, 26730.01) 이상Visual Studio 2017 Update 3 (version 15.3, 26730.01) or later.
  4. NET Core SDK 버전 2.0 이상NET Core SDK, version 2.0 or later.

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

항목에 메시지를 보내려면 Visual Studio를 사용하여 C# 콘솔 애플리케이션을 작성합니다.To send messages to the topic, write a C# console application using Visual Studio.

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

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

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

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

  2. 찾아보기 탭을 클릭하고 Microsoft.Azure.ServiceBus 를 검색한 다음 Microsoft.Azure.ServiceBus 항목을 선택합니다.Click the Browse tab, search for Microsoft.Azure.ServiceBus, and then select the Microsoft.Azure.ServiceBus item. 설치를 클릭하여 설치를 완료한 후 이 대화 상자를 닫습니다.Click Install to complete the installation, then close this dialog box.

    NuGet 패키지 선택

코드를 작성하여 토픽에 메시지 보내기Write code to send messages to the topic

  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.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Azure.ServiceBus;
    
  2. Program 클래스 내에서 다음 변수를 선언합니다.Within the Program class, declare the following variables. ServiceBusConnectionString 변수를 네임스페이스를 만들 때 가져온 연결 문자열로 설정하고, TopicName을 항목을 만들 때 사용된 이름으로 설정합니다.Set the ServiceBusConnectionString variable to the connection string that you obtained when creating the namespace, and set TopicName to the name that you used when creating the topic:

    const string ServiceBusConnectionString = "<your_connection_string>";
    const string TopicName = "<your_topic_name>";
    static ITopicClient topicClient;
    
  3. Main()이라는 기본 내용을 다음 코드줄로 바꿉니다.Replace the default contents of Main() with the following line of code:

    MainAsync().GetAwaiter().GetResult();
    
  4. Main()의 바로 뒤에 메시지 전송 메서드를 호출하는 다음 비동기 MainAsync() 메서드를 추가합니다.Directly after Main(), add the following asynchronous MainAsync() method that calls the send messages method:

    static async Task MainAsync()
    {
        const int numberOfMessages = 10;
        topicClient = new TopicClient(ServiceBusConnectionString, TopicName);
    
        Console.WriteLine("======================================================");
        Console.WriteLine("Press ENTER key to exit after sending all the messages.");
        Console.WriteLine("======================================================");
    
        // Send messages.
        await SendMessagesAsync(numberOfMessages);
    
        Console.ReadKey();
    
        await topicClient.CloseAsync();
    }
    
  5. MainAsync() 메서드의 바로 뒤에 numberOfMessagesToSend(현재 10으로 설정됨)으로 지정된 메시지 수를 전송하는 작업을 수행하는 다음 SendMessagesAsync() 메서드를 추가합니다.Directly after the MainAsync() method, add the following SendMessagesAsync() method that performs the work of sending the number of messages specified by numberOfMessagesToSend (currently set to 10):

    static async Task SendMessagesAsync(int numberOfMessagesToSend)
    {
        try
        {
            for (var i = 0; i < numberOfMessagesToSend; i++)
            {
                // Create a new message to send to the topic.
                string messageBody = $"Message {i}";
                var message = new Message(Encoding.UTF8.GetBytes(messageBody));
    
                // Write the body of the message to the console.
                Console.WriteLine($"Sending message: {messageBody}");
    
                // Send the message to the topic.
                await topicClient.SendAsync(message);
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}");
        }
    }
    
  6. 보낸 사람 Program.cs 파일은 다음과 같아야 합니다.Here is what your sender Program.cs file should look like.

    namespace CoreSenderApp
    {
        using System;
        using System.Text;
        using System.Threading;
        using System.Threading.Tasks;
        using Microsoft.Azure.ServiceBus;
    
        class Program
        {
            const string ServiceBusConnectionString = "<your_connection_string>";
            const string TopicName = "<your_topic_name>";
            static ITopicClient topicClient;
    
            static void Main(string[] args)
            {
                MainAsync().GetAwaiter().GetResult();
            }
    
            static async Task MainAsync()
            {
                const int numberOfMessages = 10;
                topicClient = new TopicClient(ServiceBusConnectionString, TopicName);
    
                Console.WriteLine("======================================================");
                Console.WriteLine("Press ENTER key to exit after sending all the messages.");
                Console.WriteLine("======================================================");
    
                // Send messages.
                await SendMessagesAsync(numberOfMessages);
    
                Console.ReadKey();
    
                await topicClient.CloseAsync();
            }
    
            static async Task SendMessagesAsync(int numberOfMessagesToSend)
            {
                try
                {
                    for (var i = 0; i < numberOfMessagesToSend; i++)
                    {
                        // Create a new message to send to the topic
                        string messageBody = $"Message {i}";
                        var message = new Message(Encoding.UTF8.GetBytes(messageBody));
    
                        // Write the body of the message to the console
                        Console.WriteLine($"Sending message: {messageBody}");
    
                        // Send the message to the topic
                        await topicClient.SendAsync(message);
                    }
                }
                catch (Exception exception)
                {
                    Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}");
                }
            }
        }
    }
    
  7. 프로그램을 실행하고 Azure Portal을 확인합니다. 네임스페이스 개요 창에서 항목 이름을 클릭합니다.Run the program, and check the Azure portal: click the name of your topic in the namespace Overview window. 항목 Essentials 화면이 표시됩니다.The topic Essentials screen is displayed. 이제 창의 맨 아래 가까이에 나열된 구독에서 각 구독에 대한 메시지 수 값은 10입니다.In the subscription listed near the bottom of the window, notice that the Message Count value for the subscription is now 10. 메시지를 검색하지 않고 보낸 사람 애플리케이션을 실행할 때마다(다음 섹션에서 설명) 이 값이 10만큼 증가합니다.Each time you run the sender application without retrieving the messages (as described in the next section), this value increases by 10. 또한 앱이 항목에 메시지를 추가할 때마다 항목의 현재 크기는 Essentials 창에 있는 현재 값을 증가시킵니다.Also note that the current size of the topic increments the Current value in the Essentials window each time the app adds messages to the topic.

    메시지 크기

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

보낸 메시지를 받으려면 다른.NET Core 콘솔 응용 프로그램 만들기 및 설치 합니다 Microsoft.Azure.ServiceBus NuGet 패키지를 이전의 보낸 사람 응용 프로그램과 유사 합니다.To receive the messages you sent, create another .NET Core console application and install the Microsoft.Azure.ServiceBus NuGet package, similar to the previous sender application.

코드를 작성하여 구독에서 메시지 받기Write code to receive messages from the subscription

  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.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Azure.ServiceBus;
    
  2. Program 클래스 내에서 다음 변수를 선언합니다.Within the Program class, declare the following variables. ServiceBusConnectionString 변수는 네임스페이스를 만들 때 가져온 연결 문자열로 설정하고, TopicName을 항목을 만들 때 사용된 이름으로 설정하고, SubscriptionName을 항목에 구독을 만들 때 사용된 이름으로 설정합니다.Set the ServiceBusConnectionString variable to the connection string that you obtained when creating the namespace, set TopicName to the name that you used when creating the topic, and set SubscriptionName to the name that you used when creating the subscription to the topic:

    const string ServiceBusConnectionString = "<your_connection_string>";
    const string TopicName = "<your_topic_name>";
    const string SubscriptionName = "<your_subscription_name>";
    static ISubscriptionClient subscriptionClient;
    
  3. Main()이라는 기본 내용을 다음 코드줄로 바꿉니다.Replace the default contents of Main() with the following line of code:

    MainAsync().GetAwaiter().GetResult();
    
  4. Main()의 바로 뒤에 RegisterOnMessageHandlerAndReceiveMessages() 메서드를 호출하는 다음 비동기 MainAsync() 메서드를 추가합니다.Directly after Main(), add the following asynchronous MainAsync() method that calls the RegisterOnMessageHandlerAndReceiveMessages() method:

    static async Task MainAsync()
    {
        subscriptionClient = new SubscriptionClient(ServiceBusConnectionString, TopicName, SubscriptionName);
    
        Console.WriteLine("======================================================");
        Console.WriteLine("Press ENTER key to exit after receiving all the messages.");
        Console.WriteLine("======================================================");
    
        // Register subscription message handler and receive messages in a loop
        RegisterOnMessageHandlerAndReceiveMessages();
    
        Console.ReadKey();
    
        await subscriptionClient.CloseAsync();
    }
    
  5. MainAsync() 메서드의 바로 뒤에 메시지 처리기를 등록하고 보낸 사람 애플리케이션에서 보낸 메시지를 수신하는 다음 메서드를 추가합니다.Directly after the MainAsync() method, add the following method that registers the message handler and receives the messages sent by the sender application:

    static void RegisterOnMessageHandlerAndReceiveMessages()
    {
        // Configure the message handler options in terms of exception handling, number of concurrent messages to deliver, etc.
        var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
        {
            // Maximum number of concurrent calls to the callback ProcessMessagesAsync(), set to 1 for simplicity.
            // Set it according to how many messages the application wants to process in parallel.
            MaxConcurrentCalls = 1,
    
            // Indicates whether the message pump should automatically complete the messages after returning from user callback.
            // False below indicates the complete operation is handled by the user callback as in ProcessMessagesAsync().
            AutoComplete = false
        };
    
        // Register the function that processes messages.
        subscriptionClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
    }
    
  6. 이전 메서드의 바로 뒤에 수신된 메시지를 처리하는 다음 ProcessMessagesAsync() 메서드를 추가합니다.Directly after the previous method, add the following ProcessMessagesAsync() method to process the received messages:

    static async Task ProcessMessagesAsync(Message message, CancellationToken token)
    {
        // Process the message.
        Console.WriteLine($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
    
        // Complete the message so that it is not received again.
        // This can be done only if the subscriptionClient is created in ReceiveMode.PeekLock mode (which is the default).
        await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
    
        // Note: Use the cancellationToken passed as necessary to determine if the subscriptionClient has already been closed.
        // If subscriptionClient has already been closed, you can choose to not call CompleteAsync() or AbandonAsync() etc.
        // to avoid unnecessary exceptions.
    }
    
  7. 마지막으로 발생할 수 있는 모든 예외를 처리하는 다음 메서드를 추가합니다.Finally, add the following method to handle any exceptions that might occur:

    // Use this handler to examine the exceptions received on the message pump.
    static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
    {
        Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
        var context = exceptionReceivedEventArgs.ExceptionReceivedContext;
        Console.WriteLine("Exception context for troubleshooting:");
        Console.WriteLine($"- Endpoint: {context.Endpoint}");
        Console.WriteLine($"- Entity Path: {context.EntityPath}");
        Console.WriteLine($"- Executing Action: {context.Action}");
        return Task.CompletedTask;
    }    
    
  8. 받는 사람 Program.cs 파일은 다음과 같아야 합니다.Here is what your receiver Program.cs file should look like:

    namespace CoreReceiverApp
    {
        using System;
        using System.Text;
        using System.Threading;
        using System.Threading.Tasks;
        using Microsoft.Azure.ServiceBus;
    
        class Program
        {
            const string ServiceBusConnectionString = "<your_connection_string>";
            const string TopicName = "<your_topic_name>";
            const string SubscriptionName = "<your_subscription_name>";
            static ISubscriptionClient subscriptionClient;
    
            static void Main(string[] args)
            {
                MainAsync().GetAwaiter().GetResult();
            }
    
            static async Task MainAsync()
            {
                subscriptionClient = new SubscriptionClient(ServiceBusConnectionString, TopicName, SubscriptionName);
    
                Console.WriteLine("======================================================");
                Console.WriteLine("Press ENTER key to exit after receiving all the messages.");
                Console.WriteLine("======================================================");
    
                // Register subscription message handler and receive messages in a loop.
                RegisterOnMessageHandlerAndReceiveMessages();
    
                Console.ReadKey();
    
                await subscriptionClient.CloseAsync();
            }
    
            static void RegisterOnMessageHandlerAndReceiveMessages()
            {
                // Configure the message handler options in terms of exception handling, number of concurrent messages to deliver, etc.
                var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
                {
                    // Maximum number of concurrent calls to the callback ProcessMessagesAsync(), set to 1 for simplicity.
                    // Set it according to how many messages the application wants to process in parallel.
                    MaxConcurrentCalls = 1,
    
                    // Indicates whether MessagePump should automatically complete the messages after returning from User Callback.
                    // False below indicates the Complete will be handled by the User Callback as in `ProcessMessagesAsync` below.
                    AutoComplete = false
                };
    
                // Register the function that processes messages.
                subscriptionClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
            }
    
            static async Task ProcessMessagesAsync(Message message, CancellationToken token)
            {
                // Process the message.
                Console.WriteLine($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
    
                // Complete the message so that it is not received again.
                // This can be done only if the subscriptionClient is created in ReceiveMode.PeekLock mode (which is the default).
                await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
    
                // Note: Use the cancellationToken passed as necessary to determine if the subscriptionClient has already been closed.
                // If subscriptionClient has already been closed, you can choose to not call CompleteAsync() or AbandonAsync() etc.
                // to avoid unnecessary exceptions.
            }
    
            static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
            {
                Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
                var context = exceptionReceivedEventArgs.ExceptionReceivedContext;
                Console.WriteLine("Exception context for troubleshooting:");
                Console.WriteLine($"- Endpoint: {context.Endpoint}");
                Console.WriteLine($"- Entity Path: {context.EntityPath}");
                Console.WriteLine($"- Executing Action: {context.Action}");
                return Task.CompletedTask;
            }
        }
    }
    
  9. 프로그램을 실행하고 포털을 다시 확인합니다.Run the program, and check the portal again. 이제 메시지 수현재 값이 0이 됩니다.Notice that the Message Count and Current values are now 0.

    항목 길이

축하합니다!Congratulations! 이제 .NET Standard 라이브러리를 사용하여 토픽 및 구독을 만들고, 10개의 메시지를 보내고, 해당 메시지를 수신했습니다.Using the .NET Standard library, you have now created a topic and subscription, sent 10 messages, and received those messages.

참고

Service Bus Explorer로 Service Bus 리소스를 관리할 수 있습니다.You can manage Service Bus resources with Service Bus Explorer. Service Bus Explorer를 사용하면 Service Bus 네임스페이스에 연결하고 쉬운 방식으로 메시징 엔터티를 관리할 수 있습니다.The Service Bus Explorer allows users to connect to a Service Bus namespace and administer messaging entities in an easy manner. 이 도구는 가져오기/내보내기 기능 또는 항목, 큐, 구독, 릴레이 서비스, Notification Hubs 및 이벤트 허브를 테스트하는 기능과 같은 고급 기능을 제공합니다.The tool provides advanced features like import/export functionality or the ability to test topic, queues, subscriptions, relay services, notification hubs and events hubs.

다음 단계Next steps

Service Bus 메시지의 고급 기능 중 일부를 보여주는 Service Bus 샘플이 있는 GitHub 리포지토리를 확인합니다.Check out the Service Bus GitHub repository with samples that demonstrate some of the more advanced features of Service Bus messaging.