抱歉,我是Azure的新手。我使用此tutorial通过Azure门户创建了服务总线和队列。
我可以从队列中读写,确定。问题是,要部署到下一个环境,我必须更新ARM模板以添加新队列或在代码中创建队列。我无法在下一个环境中通过门户创建队列。
我选择了后者:检查队列是否存在,并通过代码根据需要创建。我已经有一个CloudQueueClient的实现(在Microsoft.WindowsAzure.Storage.Queue命名空间中)。如果没有实体,它将使用CloudStorageAccount实体创建CloudQueueClient。
我希望它会如此简单,但事实并非如此。我正在努力寻找一种创建QueueClint的方法(在Microsoft.Azure.ServiceBus命名空间中)。我所拥有的只是服务总线连接字符串和队列名称,但是经过精挑细选的Microsoft文档,讨论了该过程中涉及的NamespaceManager和MessagingFactory(在不同的名称空间中)。
有人能指出我如何实现这一目标的方向,更重要的是,这是正确的方法吗?我将使用DI实例化队列,因此检查/创建将只完成一次。
解决方案对于服务总线队列而不是存储帐户队列是必需的。概述的差异here
谢谢
答案 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.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;
}
不是最容易找到的东西,但希望它能帮助某人。