如果ServiceBus主题不存在,则创建它。

14

微软已更新其.NET ServiceBus客户端库,文档目前分为旧的WindowsAzure.ServiceBus包和新的Microsoft.Azure.ServiceBus包。我喜欢新的包,因为它更加简洁且依赖性更少。在旧的包中,我们有以下方法:

if (!namespaceManager.TopicExists(topicName))
{
    var topic = new TopicDescription(topicName);
    namespaceManager.CreateTopic(topic);
}

创建主题的编程文档仍然使用旧的软件包,代码如上所示。新软件包中不再提供NamespaceManager类,那么我该怎么实现相应功能呢?

4个回答

18

2022年1月更新

微软建议使用Azure.Messaging.ServiceBus中的ServiceBusAdministrationClient来管理服务总线。

const string Topic = "<YourTopic>";    

// Create the topic if it doesn't exist
var adminClient = new ServiceBusAdministrationClient(ConnectionString);
if (!await adminClient.TopicExistsAsync(Topic))
    await adminClient.CreateTopicAsync(Topic);

创建订阅的方法类似。

感谢Quan的更新。


原始回答

在Github Repo azure-service-bus-dotnet上,他们解释了如何管理Service Bus实体:

管理Azure资源的标准方式是使用Azure Resource Manager。为了使用以前存在于.NET Framework Service Bus客户端库中的功能,您将需要使用Microsoft.Azure.Management.ServiceBus库。这将使得动态创建/读取/更新/删除资源的用例成为可能。

这里有一个使用该库的示例:

你需要安装这些包:

  • Microsoft.Azure.Management.ServiceBus
  • Microsoft.Azure.Management.ResourceManager
  • Microsoft.IdentityModel.Clients.ActiveDirectory

如果你想创建主题,以下是你需要了解的有趣部分。请注意,您不需要检查主题是否存在。Azure资源管理器仅在资源已经存在时才会更新资源。

// On you've got the ServiceBusManagementClient
ServiceBusManagementClient sbClient = ...

sbClient.Topics.CreateOrUpdateAsync("resource group name", "namespace name", "topic name", 
    new Microsoft.Azure.Management.ServiceBus.Models.SBTopic());

谢谢Thomas。我浏览了一下自述文件,但没有注意到“管理服务总线实体”等同于“创建/读取/更新主题和订阅”。那么“资源组名称”的问题是什么?我认为这与我在Azure门户中看到的资源组相同,但如果资源在Azure中移动,这是否会使这样的代码更容易出现错误? - Andrew Williamson
是的,这是Azure上资源组的名称。我猜这取决于您是否使用多个资源组。也许您可以提出另一个问题来处理它。 - Thomas

9
在.NET Core中,您可以使用ManagementClient来执行此操作,相比命名空间管理器更容易。
try
{   
    await managementClient.GetTopicAsync(topicName);
}
catch (MessagingEntityNotFoundException)
{   
    await managementClient.CreateTopicAsync(new TopicDescription(topicName) { EnablePartitioning = true });
}

try
{
    await managementClient.GetQueueAsync(queueName);
}
catch (MessagingEntityNotFoundException)
{
    await managementClient.CreateQueueAsync(new QueueDescription(queueName) { EnablePartitioning = true });
}

请查看azure-service-bus-dotnet/issues/65


6

接受的答案是在2017年,因此现在(2022年1月13日)有关于如何在Azure Service Bus上创建主题的更新。

Microsoft建议在其最新的Azure.Messaging.ServiceBus包中使用ServiceBusAdministrationClient。

安装NuGet包:Azure.Messaging.ServiceBus。

以下是创建新主题的方法:

const string Topic = "<YourTopic>";    

// Create the topic if it doesn't exist
var adminClient = new ServiceBusAdministrationClient(ConnectionString);
if (!await adminClient.TopicExistsAsync(Topic))
    await adminClient.CreateTopicAsync(Topic);

创建订阅同理。

本答案基于此文章https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-management-libraries#manage-using-service-bus-client-libraries


1
嗨全,感谢更新。一个问题不能有两个答案,所以我会将这个内容作为Thomas的回答更新。 - Andrew Williamson

1
如果您可以等待,NamespaceManager也可以作为一个独立的软件包,详见下面的问题。该问题中列出了它将支持的选项
  • 获取 - 仅限于存在检查并返回元数据
  • GetRuntimeInformation(获取所有计数和最后状态,大约计数,精确到10秒)
  • 获取队列名称、主题名称(列出实体名称)
  • 创建实体
  • 删除实体
  • 更新(需要有关要更新的元数据的详细信息,可以在实现期间完成)
  • 查找或创建(Upsert - 如果队列不存在则创建它)
  • 更新或创建(Upsert)

如果您想使用NamespaceManager,那么值得跟进这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接