2

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

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

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

4

1 回答 1

3

正如您在评论中提到的,您可以在客户端连接(或应用程序启动)时创建具有唯一 GUID 作为订阅名称的新订阅。并指定SubscriptionDescription.AutoDeleteOnIdle 属性来设置 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)的信息,并且每次客户端连接/重新连接时,您可以检测外部存储中是否存在指示订阅的记录(此客户端之前使用的)对于当前客户端仍然没有被删除,如果记录存在,您可以在创建新订阅之前删除该订阅。

于 2017-07-18T06:32:43.910 回答