2017-07-14 3 views
0

サブスクリプション名を指定せずにトピックを作成し、サブスクリプションごとにサブスクリプションを複数の独立したサブスクライバに登録する方法を教えてください。サブスクライバが切断すると、対応するサブスクリプションは自動的に削除されます。この場合は、例えば、logging目的のためにrabbitmqサーバで実現できます。 https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.htmlAzureサービスバスのトピックで、生成された名前の排他的な自動登録サブスクリプションがある

.NETクライアントでは、queueDeclare()にパラメータを指定しないと、生成された名前の非永続的な排他的な自動転送キューを作成します。

このケースを実現するにはどうすれば.netクライアントをラップできますか?ありがとう。

+0

「購読者が切断した場合、対応する購読を自動的に削除する必要があります。」あなたの実際の要件についてさらに説明できますか? 「購読者の切断」は、加入者(クライアントユーザー)の切断またはアプリの停止を意味しますか? –

+0

私はどちらの場合もそうだと思います。サブスクリプションごとに私は1つのクライアントしか持っていません。クライアントは、手動で停止したり、停止したり、破損したりすることができます。どのような場合でも、対応する購読を自動的に削除する必要があります。おそらくそれ以上のリンクでは、より明確に説明されています。可能な解決策:新しいクライアントごとに購読する名前として一意のGUIDを生成すること。クライアントが手動で停止した場合は、サブスクリプションを手動で削除します。破損した場合は、SubscriptionDescription.AutoDeleteOnIdleプロパティを使用して自動削除します。 – Tselofan

答えて

1

あなたのコメントで述べたように、クライアントが接続する(またはアプリが起動する)ときに、サブスクリプション名として一意のGUIDを持つ新しいサブスクリプションを作成できます。サブスクリプションが自動的に削除されるまでの時間間隔を設定するには、SubscriptionDescription.AutoDeleteOnIdle propertyを指定します。

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)に関する情報を保持することができ、そしてクライアントが再接続/接続するたびに、あなたがどうかを検出することができますレコードが存在する場合、新しいサブスクリプションを作成する前にそのサブスクリプションを削除することができます。

関連する問題