通过代码创建Azure ServiceBus队列

时间:2019-04-12 11:20:30

标签: c# azure .net-core asp.net-core-2.0 azure-servicebus-queues

抱歉,我是Azure的新手。我使用此tutorial通过Azure门户创建了服务总线和队列。

我可以从队列中读写,确定。问题是,要部署到下一个环境,我必须更新ARM模板以添加新队列或在代码中创建队列。我无法在下一个环境中通过门户创建队列。

我选择了后者:检查队列是否存在,并通过代码根据需要创建。我已经有一个CloudQueueClient的实现(在Microsoft.WindowsAzure.Storage.Queue命名空间中)。如果没有实体,它将使用CloudStorageAccount实体创建CloudQueueClient。

我希望它会如此简单,但事实并非如此。我正在努力寻找一种创建QueueClint的方法(在Microsoft.Azure.ServiceBus命名空间中)。我所拥有的只是服务总线连接字符串和队列名称,但是经过精挑细选的Microsoft文档,讨论了该过程中涉及的NamespaceManagerMessagingFactory(在不同的名称空间中)。

有人能指出我如何实现这一目标的方向,更重要的是,这是正确的方法吗?我将使用DI实例化队列,因此检查/创建将只完成一次。

解决方案对于服务总线队列而不是存储帐户队列是必需的。概述的差异here

谢谢

3 个答案:

答案 0 :(得分:1)

要使用新客户端Microsoft.Azure.ServiceBus创建实体,您将需要通过创建实例并调用ManagemnetClient来使用CreateQueueAsync()

答案 1 :(得分:0)

您也可以使用NamespaceManager创建服务总线队列,

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

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

var queue = await namespaceManager.CreateQueueAsync(_azureQueue);

答案 2 :(得分:0)

Sean Feldman的回答为我指明了正确的方向。所需的主要nuget程序包/命名空间(.net core)是

  • Microsoft.Azure.ServiceBus
  • Microsoft.Azure.ServiceBus.Management

    这是我的解决方法:

    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.Result; 
    }
    

不是最容易找到的东西,但希望它能帮助某人。