2017-07-14 96 views
0

如何创建主题并在其上订阅具有不同订阅的多个独立订阅者,而无需指定订阅名称。如果用户断开,相应的订阅应该被自动删除。例如,这种情况可以通过用于记录目的的rabbitmq服务器来实现。 https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.htmlAzure服务总线主题与生成名称的独家自动删除订阅

在.NET客户端中,当我们不向queueDeclare()提供参数时,我们使用生成的名称创建一个非持久的排他自动删除队列。

如果不可能的话,如何包装.net客户端来实现这种情况?谢谢。

+0

''如果用户断开,相应的订阅应该自动删除.'''你能解释更多关于你的实际需求吗? “订阅者断开连接”是指用户(客户端用户)断开连接还是应用程序停止? –

+0

我认为这两种情况。对于每个订阅,我只有一个客户端。客户可以断开manualy,stoped或粉碎。在所有情况下,我都希望将相应的订阅自动删除。可能在上面的链接中更清楚地解释它。可能的解决方案:为每个新客户端生成唯一的GUID作为订阅名称。如果客户端手动停止,我删除订阅manualy,如果它被击碎,我使用SubscriptionDescription.AutoDeleteOnIdle属性来自动删除。 – Tselofan

回答

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%删除订阅,您可以在外部存储保存有关客户端和subscriptionname(唯一的GUID)的信息,每次当一个客户端连接/重新连接时,可以检测一个记录存在于外部存储器中,表示此客户机尚未删除订阅(此客户机使用此订阅之前),如果该记录存​​在,则可以在创建新订阅之前删除该订阅。