#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");
Я адаптировал этот код из принятого ответа в этой теме.