Начало работы с очередями Служебной шины Azure (.NET)

В этом кратком руководстве показано, как выполнять следующие действия:

  1. Создание пространства имен служебной шины с помощью портала Azure.
  2. Создание очереди служебной шины с помощью портала Azure.
  3. Написание консольного приложения .NET Core для отправки набора сообщений в очередь.
  4. Написание консольного приложения .NET Core для получения этих сообщений из очереди.

Примечание

В этом кратком руководстве содержатся пошаговые инструкции для простого сценария отправки пакета сообщений в очередь Служебной шины и их получения. Готовые примеры .NET для Служебной шины Azure вы найдете в репозитории пакета SDK Azure для .NET на GitHub.

Предварительные требования

Если вы новичок в этой службе, прежде чем приступить к этому руководству, ознакомьтесь с обзором Служебной шины Azure.

  • Подписка Azure. Чтобы использовать службы Azure, включая служебную шину Azure, вам потребуется подписка. Если у вас нет существующей учетной записи Azure, вы можете зарегистрироваться и получить бесплатную пробную версию.
  • Microsoft Visual Studio 2019. Чтобы использовать службы Azure, включая служебную шину Azure, вам потребуется подписка. Вы по-прежнему можете использовать библиотеку с предыдущими версиями языка C#, но новый синтаксис будет недоступен. Чтобы использовать полный синтаксис, рекомендуется выполнять компиляцию с помощью пакета SDK для .NET Core 3.0 или более поздней версии, а для языковой версии должно быть установлено значение latest. Если вы используете Visual Studio, учитывайте, что версии до Visual Studio 2019 несовместимы со средствами, необходимыми для сборки проектов C# 8.0.

Создание пространства имен на портале Azure

Чтобы приступить к использованию сущностей обмена сообщениями в служебной шине в Azure, сначала необходимо создать пространство имен с уникальным для Azure именем. Пространство имен предоставляет контейнер для адресации ресурсов служебной шины в вашем приложении.

Создание пространства имен службы:

  1. Войдите на портал Azure

  2. На портале на панели навигации слева выберите + Создать ресурс, Интеграция, а затем — Служебная шина.

    Изображение: выбор "Создать ресурс", "Интеграция" и "Служебная шина" в меню.

  3. В теге Основные сведения на странице Создание пространства имен выполните следующие действия:

    1. Выберите подписку Azure, в которой будет создано пространство имен.

    2. Выберите существующую группу ресурсов, в которую будет включено это пространство имен, или создайте новую.

    3. Введите имя для пространства имен. Система немедленно проверяет, доступно ли оно. Список правил для именования пространств имен см. в статье об API REST для создания пространства имен.

    4. Укажите расположение — регион для размещения пространства имен.

    5. Для параметра Ценовая категория выберите ценовую категорию ("Базовый", "Стандартный" или "Премиум") для пространства имен. Для работы с этим кратким руководством выберите вариант Стандартный.

      Чтобы использовать разделы и подписки, выберите категорию "Стандартный" или "Премиум". Разделы и подписки не поддерживаются в ценовой категории "Базовый".

      Если выбрана ценовая категория Премиум, укажите число единиц обмена сообщениями. В категории "Премиум" обеспечивается изоляция ресурсов на уровне ЦП и памяти, так что рабочая нагрузка выполняется изолированно от других. Контейнер ресурса называется единицей обмена сообщениями. Пространству имен ценовой категории "Премиум" выделяется по крайней мере одна единица обмена сообщениями. Для каждого пространства имен служебной шины Premium можно выбрать 1, 2 или 4 единицы обмена сообщениями. Дополнительные сведения см. в статье Уровни обмена сообщениями через служебную шину Premium и Standard.

    6. Выберите Review + create (Просмотреть и создать). Теперь система создает пространство имен и включает его. Возможно, вам придется подождать несколько минут, пока система выделит ресурсы для вашей учетной записи.

      Изображение: страница "Создание пространства имен"

    7. На странице Проверить и создать проверьте параметры и нажмите кнопку Создать.

  4. Выберите Перейти к ресурсу на странице развертывания.

    Изображение: страница "Развертывание успешно выполнено" со ссылкой "Перейти к ресурсу".

  5. Вы увидите домашнюю страницу пространства имен служебной шины.

    Изображение: домашняя страница созданного пространства имен Служебной шины.

Получение строки подключения

При создании нового пространства имен автоматически создается начальная политика подписанного URL-адреса (SAS), первичный и вторичный ключи, а также первичная и вторичная строки подключения, каждая из которых предоставляет полный контроль над всеми аспектами пространства имен. Сведения о том, как в дальнейшем создавать правила с ограниченными правами для постоянных отправителей и получателей, см. в статье Аутентификация и авторизация в служебной шине.

Чтобы скопировать первичную строку подключения для пространства имен, выполните следующие действия:

  1. На странице Пространство имен служебной шины выберите Политики общего доступа в меню слева.

  2. На странице Политики общего доступа щелкните RootManageSharedAccessKey.

    Снимок экрана: окно "Политики общего доступа" с выделенной политикой.

  3. В окне Policy: RootManageSharedAccessKey (Политика: RootManageSharedAccessKey) нажмите кнопку копирования рядом с полем Первичная строка подключения, чтобы скопировать строку подключения в буфер обмена для последующего использования. Вставьте на время эти значения в Блокноте или любом другом месте.

    Снимок экрана: политика SAS с именем RootManageSharedAccessKey, которая содержит ключи и строки подключения.

    Эту страницу можно использовать для копирования первичного и вторичного ключей, а также вторичной строки подключения.

Создание очереди на портале Azure

  1. На странице Пространство имен служебной шины в меню навигации слева выберите Очереди.

  2. На странице Очереди на панели инструментов выберите + Очередь.

  3. Введите имя очереди, остальные значения по умолчанию не изменяйте.

  4. Выберите Создать.

    Изображение: создание очереди на портале

Отправка сообщений в очередь

В этом разделе показано, как создать консольное приложение .NET Core для отправки сообщений в очередь служебной шины.

Создание консольного приложение

  1. Запустите Visual Studio 2019.

  2. Выберите Создать новый проект.

  3. В диалоговом окне Создать проект выполните следующие действия: Если это диалоговое окно не отображается, щелкните в меню пункт Файл, затем последовательно выберите Новый и Проект.

    1. Выберите язык программирования C#.

    2. Для типа приложения выберите значение Консоль.

    3. В списке результатов выберите Консольное приложение.

    4. Затем нажмите кнопку Далее.

      Изображение, показывающее диалоговое окно "Создание нового проекта" с выбранными C# и консолью

  4. Введите QueueSender в качестве имени проекта, ServiceBusQueueQuickStart в качестве имени решения, после чего нажмите Далее.

    Изображение с названием решения и проекта в диалоговом окне "Настройка нового проекта"

  5. На странице Дополнительная информация выберите Создать для создания решения и проекта.

Получение пакета NuGet для служебной шины

  1. Выберите в меню элементы Инструменты > Диспетчер пакетов NuGet > Консоль диспетчера пакетов.

  2. Выполните следующую команду, чтобы установить пакет NuGet Azure.Messaging.ServiceBus:

    Install-Package Azure.Messaging.ServiceBus
    

Добавление кода для отправки сообщений в очередь

  1. В файле Program.cs добавьте приведенные ниже инструкции using в начале определения пространства имен перед объявлением класса.

    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
  2. В классе Program объявите указанные ниже свойства непосредственно перед методом Main.

    Замените <NAMESPACE CONNECTION STRING> первичной строкой подключения к пространству имен Служебной шины. Далее, замените <QUEUE NAME> именем вашей очереди.

    
    // connection string to your Service Bus namespace
    static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
    // name of your Service Bus queue
    static string queueName = "<QUEUE NAME>";
    
    // the client that owns the connection and can be used to create senders and receivers
    static ServiceBusClient client;
    
    // the sender used to publish messages to the queue
    static ServiceBusSender sender;
    
    // number of messages to be sent to the queue
    private const int numOfMessages = 3;
    
    
  3. Замените код в методе Main следующим кодом. Дополнительные сведения о коде см. в комментариях к нему. Ниже описаны важные этапы, реализованные в данном коде.

    1. Создание объекта ServiceBusClient с использованием первичной строки подключения к пространству имен.

    2. Вызов метода CreateSender для ServiceBusClient. Это позволяет создать объект ServiceBusSender для указанной очереди Служебной шины.

    3. Создание объекта ServiceBusMessageBatch с использованием метода ServiceBusSender.CreateMessageBatchAsync.

    4. Добавление сообщений в пакет с помощью ServiceBusMessageBatch.TryAddMessage.

    5. Отправка пакета сообщений в очередь Служебной шины Microsoft Azure с помощью метода ServiceBusSender.SendMessagesAsync.

      static async Task Main()
      {
          // The Service Bus client types are safe to cache and use as a singleton for the lifetime
          // of the application, which is best practice when messages are being published or read
          // regularly.
          //
          // Create the clients that we'll use for sending and processing messages.
          client = new ServiceBusClient(connectionString);
          sender = client.CreateSender(queueName);
      
          // create a batch 
          using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
      
          for (int i = 1; i <= numOfMessages; i++)
          {
              // try adding a message to the batch
              if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}")))
              {
                  // if it is too large for the batch
                  throw new Exception($"The message {i} is too large to fit in the batch.");
              }
          }
      
          try
          {
              // Use the producer client to send the batch of messages to the Service Bus queue
              await sender.SendMessagesAsync(messageBatch);
              Console.WriteLine($"A batch of {numOfMessages} messages has been published to the queue.");
          }
          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();
          }
      
          Console.WriteLine("Press any key to end the application");
          Console.ReadKey();
      }    
      
  4. Вот как будет выглядеть файл Program.cs:

    using System;
    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
    namespace QueueSender
    {
        class Program
        {
            // connection string to your Service Bus namespace
            static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
            // name of your Service Bus queue
            static string queueName = "<QUEUE NAME>";
    
            // the client that owns the connection and can be used to create senders and receivers
            static ServiceBusClient client;
    
            // the sender used to publish messages to the queue
            static ServiceBusSender sender;
    
            // number of messages to be sent to the queue
            private const int numOfMessages = 3;
    
            static async Task Main()
            {
                // The Service Bus client types are safe to cache and use as a singleton for the lifetime
                // of the application, which is best practice when messages are being published or read
                // regularly.
                //
                // Create the clients that we'll use for sending and processing messages.
                client = new ServiceBusClient(connectionString);
                sender = client.CreateSender(queueName);
    
                // create a batch 
                using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
    
                for (int i = 1; i <= numOfMessages; i++)
                {
                    // try adding a message to the batch
                    if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}")))
                    {
                        // if it is too large for the batch
                        throw new Exception($"The message {i} is too large to fit in the batch.");
                    }
                }
    
                try
                {
                    // Use the producer client to send the batch of messages to the Service Bus queue
                    await sender.SendMessagesAsync(messageBatch);
                    Console.WriteLine($"A batch of {numOfMessages} messages has been published to the queue.");
                }
                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();
                }
    
                Console.WriteLine("Press any key to end the application");
                Console.ReadKey();
            }
        }
    }   
    
  5. Замените <NAMESPACE CONNECTION STRING> первичной строкой подключения к пространству имен Служебной шины. Далее, замените <QUEUE NAME> именем вашей очереди.

  6. Выполните сборку проекта и убедитесь, что она прошла без ошибок.

  7. Выполните программу и дождитесь подтверждающего сообщения.

    A batch of 3 messages has been published to the queue
    
  8. На портале Azure выполните следующие действия:

    1. Перейдите к пространству имен Служебной шины.

    2. На странице Обзор выберите очередь в центральной области снизу.

      Изображение, показывающее страницу пространства имен служебной шины на портале Microsoft Azure с выбранной очередью.

    3. Обратите внимание на значения в разделе Основное.

    Изображение, показывающее количество полученных сообщений и размер очереди

    Обратите внимание на следующие значения:

    • Значение счетчика Активных сообщений для очереди теперь равно 3. Всякий раз, когда вы запускаете это приложение-отправитель без получения сообщений, это значение увеличивается на 3.
    • Текущий размер очереди увеличивается каждый раз, когда приложение добавляет сообщения в очередь.
    • На диаграмме Сообщения в нижнем разделе Показатели вы можете увидеть, что в очереди есть три входящих сообщения.

Получение сообщений из очереди

В этом разделе вы создадите консольное приложение .NET Core, которое будет получать сообщения из очереди.

Создание проекта для получателя

  1. В окне Обозревателя решений щелкните правой кнопкой мыши решение ServiceBusQueueQuickStart, выберите Добавить и выберите Новый проект.
  2. Выберите Консольное приложение и нажмите Далее.
  3. Введите QueueReceiver в поле Название проекта и выберите Создать.
  4. В окне Обозреватель решений щелкните правой кнопкой мыши QueueReceiver и выберите Установить как запускаемый проект.

Получение пакета NuGet для служебной шины

  1. Выберите в меню элементы Инструменты > Диспетчер пакетов NuGet > Консоль диспетчера пакетов.

  2. В окне Консоли диспетчера пакетов убедитесь, что QueueReceiver выбран в качестве проекта по умолчанию. В противном случае, используйте раскрывающийся список, чтобы выбрать QueueReceiver.

    Снимок экрана: проект QueueReceiver, выбранный в консоли диспетчера пакетов

  3. Выполните следующую команду, чтобы установить пакет NuGet Azure.Messaging.ServiceBus:

    Install-Package Azure.Messaging.ServiceBus
    

Добавьте код для получения сообщений из очереди

В рамках этого раздела вы добавите код для получения сообщений из очереди.

  1. В файле Program.cs добавьте приведенные ниже инструкции using в начале определения пространства имен перед объявлением класса.

    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
  2. В классе Program объявите указанные ниже свойства непосредственно перед методом Main.

    Замените <NAMESPACE CONNECTION STRING> первичной строкой подключения к пространству имен Служебной шины. Далее, замените <QUEUE NAME> именем вашей очереди.

    // connection string to your Service Bus namespace
    static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
    // name of your Service Bus queue
    static string queueName = "<QUEUE NAME>";
    
    // the client that owns the connection and can be used to create senders and receivers
    static ServiceBusClient client;
    
    // the processor that reads and processes messages from the queue
    static ServiceBusProcessor processor;
    
  3. Добавьте указанные ниже методы в класс Program для обработки полученных сообщений и любых ошибок.

    // 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;
    }
    
  4. Замените код в методе Main следующим кодом. Дополнительные сведения о коде см. в комментариях к нему. Ниже описаны важные этапы, реализованные в данном коде.

    1. Создание объекта ServiceBusClient с использованием первичной строки подключения к пространству имен.

    2. Вызов метода CreateProcessor для объекта ServiceBusClient.Это позволяет создать объект ServiceBusProcessor для указанной очереди Служебной шины.

    3. Указание обработчиков для событий ProcessMessageAsync и ProcessErrorAsync объекта ServiceBusProcessor.

    4. Запуск обработки сообщений путем вызова StartProcessingAsync для объекта ServiceBusProcessor.

    5. Вызов StopProcessingAsync для объекта ServiceBusProcessor при нажатии пользователем кнопки для завершения обработки.

      Дополнительные сведения см. в комментариях, содержащихся в коде.

              static async Task Main()
              {
                  // The Service Bus client types are safe to cache and use as a singleton for the lifetime
                  // of the application, which is best practice when messages are being published or read
                  // regularly.
                  //
      
                  // Create the client object that will be used to create sender and receiver objects
                  client = new ServiceBusClient(connectionString);
      
                  // create a processor that we can use to process the messages
                  processor = client.CreateProcessor(queueName, new ServiceBusProcessorOptions());
      
                  try
                  {
                      // 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");
                  }
                  finally
                  {
                      // Calling DisposeAsync on client types is required to ensure that network
                      // resources and other unmanaged objects are properly cleaned up.
                      await processor.DisposeAsync();
                      await client.DisposeAsync();
                  }
              }
      
  5. Вот как будет выглядеть файл Program.cs:

    using System;
    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
    namespace QueueReceiver
    {
        class Program
        {
            // connection string to your Service Bus namespace
            static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
            // name of your Service Bus queue
            static string queueName = "<QUEUE NAME>";
    
    
            // the client that owns the connection and can be used to create senders and receivers
            static ServiceBusClient client;
    
            // the processor that reads and processes messages from the queue
            static ServiceBusProcessor processor;
    
            // 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;
            }
    
            static async Task Main()
            {
                // The Service Bus client types are safe to cache and use as a singleton for the lifetime
                // of the application, which is best practice when messages are being published or read
                // regularly.
                //
    
                // Create the client object that will be used to create sender and receiver objects
                client = new ServiceBusClient(connectionString);
    
                // create a processor that we can use to process the messages
                processor = client.CreateProcessor(queueName, new ServiceBusProcessorOptions());
    
                try
                {
                    // 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");
                }
                finally
                {
                    // Calling DisposeAsync on client types is required to ensure that network
                    // resources and other unmanaged objects are properly cleaned up.
                    await processor.DisposeAsync();
                    await client.DisposeAsync();
                }
            }
        }
    }
    
  6. Замените <NAMESPACE CONNECTION STRING> первичной строкой подключения к пространству имен Служебной шины. Далее, замените <QUEUE NAME> именем вашей очереди.

  7. Выполните сборку проекта и убедитесь, что она прошла без ошибок.

  8. Запустите приложение получателя. Вы должны увидеть полученные сообщения. Нажмите любую клавишу, чтобы остановить работу приемника и приложения.

    Wait for a minute and then press any key to end the processing
    Received: Message 1
    Received: Message 2
    Received: Message 3
    
    Stopping the receiver...
    Stopped receiving messages
    
  9. Снова просмотрите сведения на портале. Подождите несколько минут и обновите страницу, если вы не видите 0 для Активных сообщений.

    • Значения Активных сообщений и Текущий размер теперь равны 0.

    • На диаграмме Сообщения в разделе Метрики в нижней части страницы можно увидеть, что в очередь поступило три входящих и три исходящих сообщения.

      Активные сообщения и их размер после получения

Дальнейшие действия

Ознакомьтесь со следующими примерами и документацией: