如果ServiceBus主题尚不存在,请创建它

And*_*son 5 c# azure azureservicebus

Microsoft已更新其.NET ServiceBus客户端库,其文档目前分为旧的WindowsAzure.ServiceBus包和新的Microsoft.Azure.ServiceBus包.我喜欢新的包,因为它更清洁,依赖性更低.在旧包中,我们有如下方法:

if (!namespaceManager.TopicExists(topicName))
{
    var topic = new TopicDescription(topicName);
    namespaceManager.CreateTopic(topic);
}
Run Code Online (Sandbox Code Playgroud)

以编程方式创建主题的文档仍然使用旧包,其代码如上所述.这个NamespaceManager类在新包中不可用,那么我怎样才能达到相应的目的呢?

Hoj*_*atK 6

在.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 });
}
Run Code Online (Sandbox Code Playgroud)

参见azure-service-bus-dotnet / issues / 65


Qua*_*uan 6

接受的答案是在 2017 年,因此我们于今天 2022 年 1 月 13 日对如何在 Azure 服务总线上创建主题进行了更新。

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);
Run Code Online (Sandbox Code Playgroud)

与创建订阅类似。

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


Tho*_*mas 5

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

有关如何使用此库的示例:

你需要安装这些包:

  • 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());
Run Code Online (Sandbox Code Playgroud)