Создание очереди служебной шины Azure с помощью кода

#c# #azure #.net-core #asp.net-core-2.0 #azure-servicebus-queues

#c# #azure #.net-ядро #asp.net-core-2.0 #azure-servicebus-queues

Вопрос:

Прошу прощения, я новичок в Azure. Я создал служебную шину и очередь через портал Azure с помощью этого руководства.

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

Я выбрал последнее: проверьте, существует ли очередь, и создайте ее по мере необходимости с помощью кода. У меня уже есть реализация для этого для CloudQueueClient (в Microsoft.WindowsAzure.Хранение.Пространство имен очереди). При этом для создания CloudQueueClient используется объект CloudStorageAccount, если он не существует.

Я надеялся, что это будет так просто, но, похоже, это не так. Я изо всех сил пытаюсь найти способ создать QueueClint (в Microsoft.Azure.Пространство имен служебной шины). Все, что у меня есть, это строка подключения к служебной шине и имя очереди, но, просмотрев документы Microsoft, есть разговор о NamespaceManager и MessagingFactory (в другом пространстве имен), участвующих в процессе.

Может ли кто-нибудь указать мне, как этого добиться, и, что более важно, правильный ли это подход? Я буду использовать DI для создания экземпляра очереди, поэтому проверка / создание будет выполняться только один раз.

Решение требуется для очереди служебной шины, а не для очереди учетных записей хранения. Различия, описанные здесь

Спасибо

Ответ №1:

Ответ Шона Фельдмана указал мне правильное направление. Основными требуемыми пакетами / пространствами имен nuget (.net core) являются

  • Майкрософт.Azure.Служебная шина
  • Майкрософт.Azure.Служебная шина.Руководство

Вот мое решение:

 private readonly Lazy<Task<QueueClient>> asyncClient;
private readonly QueueClient client;`
  
public MessageBusService(string connectionString, string queueName)
{
    asyncClient = new Lazy<Task<QueueClient>>(async () =>
    {
        var managementClient = new ManagementClient(connectionString);

        var allQueues = await managementClient.GetQueuesAsync();

        var foundQueue = allQueues.Where(q => q.Path == queueName.ToLower()).SingleOrDefault();

        if (foundQueue == null)
        {
            await managementClient.CreateQueueAsync(queueName);//add queue desciption properties
        }


        return new QueueClient(connectionString, queueName);
    });

    client = asyncClient.Value.Resu< 
}
  

Не самая простая вещь, которую можно найти, но надеюсь, что это кому-то поможет.

Комментарии:

1. Чувак, это спасло мне жизнь. Большое спасибо. Я даже не знаю, где вы нашли этот код

Ответ №2:

Для создания объектов с новым клиентом Microsoft.Azure.Служебную шину вам нужно будет использовать ManagemnetClient путем создания экземпляра и вызова CreateQueueAsync() .

Ответ №3:

Пакет Microsoft.Azure.ServiceBus nuget в принятом ответе теперь устарел. Для использования Azure.Messaging.ServiceBus пакета вместо этого требуется следующий код:

 using Azure.Messaging.ServiceBus.Administration;

var client = new ServiceBusAdministrationClient(connectionString);

if (!await client.QueueExistsAsync(queueName))
{
    await client.CreateQueueAsync(queueName);
}
  

Ответ №4:

Аналогично можно создать очередь служебной шины с помощью NamespaceManager,

 QueueDescription _serviceBusQueue = new QueueDescription("QUEUENAME");   //assign the required properties to _serviceBusQueue 

NamespaceManager namespaceManager = NamespaceManager.CreateFromConnectionString("CONNECTIONSTRING");

var queue = await namespaceManager.CreateQueueAsync(_azureQueue);
  

Комментарии:

1. Спасибо, но NamespaceManager недоступен в пакете Nuget Azure ServiceBus, предназначенном для .net core. Мне нужно использовать диспетчер ресурсов Azure для создания этих объектов. Ваш ответ привел меня по этому пути: tomasherceg.com/blog/post /…

Ответ №5:

На случай, если вам нужна более современная реализация с использованием более новой Azure.Обмен сообщениями.Библиотека служебной шины, вам необходимо установить пакет System.Linq.Асинхронный

Это метод расширения для создания «отсутствующих» очередей из вашего пространства имен служебной шины

 using Azure.Messaging.ServiceBus.Administration;
using System.Threading.Tasks;
using System.Linq;
using System;

public static class ServiceBusAdministrationClientExtensions
{
    public static async Task CreateMissingQueuesAsync(this ServiceBusAdministrationClient serviceBusAdministrationClient, params string[] queueNames)
    {
        var allQueues = serviceBusAdministrationClient.GetQueuesAsync();

        var queueList = await allQueues.ToListAsync();

        foreach (var queueName in queueNames) {

            var foundQueue = queueList.Where(q => q.Name == queueName.ToLower()).Any();

            if (!foundQueue)
            {
                var queueOptions = new CreateQueueOptions(queueName)
                {
                    DefaultMessageTimeToLive = TimeSpan.FromHours(1),
                    LockDuration = TimeSpan.FromSeconds(30)
                };
                await serviceBusAdministrationClient.CreateQueueAsync(queueOptions);
            }
        }
    }
}
  

Затем вызовите метод расширения с помощью вызова, подобного этому.

 var _serviceBusAdminClient = new ServiceBusAdministrationClient(ServiceBusConnectionString);
await _serviceBusAdminClient.CreateMissingQueuesAsync("queueName");
  

Я адаптировал этот код из принятого ответа в этой теме.