Azure Service Bus主题,包含具有生成名称的独占,自动删除订阅

时间:2017-07-14 12:18:29

标签: publish-subscribe azure-servicebus-topics

如何创建主题并在其上订阅多个独立订阅者,每个订阅者具有不同的订阅,而不指定订阅名称。如果订户断开连接,则应自动删除相应的订阅。例如,这种情况可以用rabbitmq服务器实现,用于记录目的。 https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html

  

在.NET客户端中,当我们没有向queueDeclare()提供参数时,我们创建了一个带有生成名称的非持久的独占自动删除队列。

如果不可能,我如何包装.net客户端以实现这种情况?感谢。

1 个答案:

答案 0 :(得分:1)

正如您在评论中提到的,当客户端连接(或应用程序启动)时,您可以创建具有唯一GUID作为订阅名称的新订阅。并指定SubscriptionDescription.AutoDeleteOnIdle property以设置TimeSpan空闲间隔,然后自动删除订阅。

var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);

var subscriptionname = Guid.NewGuid().ToString();

if (!namespaceManager.SubscriptionExists(topicname, subscriptionname))
{
    SqlFilter updatedMessagesFilter =
        new SqlFilter("mypro = 'test'");

    namespaceManager.CreateSubscription(new SubscriptionDescription(topicname, subscriptionname) { AutoDeleteOnIdle = TimeSpan.FromMinutes(5) },
        updatedMessagesFilter);
} 

当客户端断开连接时,您可以手动删除订阅。

if (namespaceManager.SubscriptionExists(topicname, subscriptionname))
{
    namespaceManager.DeleteSubscription(topicname, subscriptionname);
}

注意:为了保证100%删除订阅,您可以在外部存储中保留有关客户端和订阅名称(唯一GUID)的信息,并且每次客户端连接/重新连接时,您都可以检测是否外部存储中存在一条记录,表示当前客户端仍未删除订阅(以前由此客户端使用),如果该记录存​​在,则可以在创建新订阅之前删除该订阅。