如何创建主题并在其上订阅多个独立订阅者,每个订阅者具有不同的订阅,而不指定订阅名称。如果订户断开连接,则应自动删除相应的订阅。例如,这种情况可以用rabbitmq服务器实现,用于记录目的。 https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html。
在.NET客户端中,当我们没有向queueDeclare()提供参数时,我们创建了一个带有生成名称的非持久的独占自动删除队列。
如果不可能,我如何包装.net客户端以实现这种情况?感谢。
答案 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)的信息,并且每次客户端连接/重新连接时,您都可以检测是否外部存储中存在一条记录,表示当前客户端仍未删除订阅(以前由此客户端使用),如果该记录存在,则可以在创建新订阅之前删除该订阅。