/// <summary> /// Unregisters a Service or Actor <paramref name="reference"/> as subscriber for messages of type <paramref name="messageTypeName"/> /// </summary> /// <param name="reference"></param> /// <param name="messageTypeName"></param> /// <returns></returns> public async Task UnsubscribeAsync(ReferenceWrapper reference, string messageTypeName) { await WaitForInitializeAsync(CancellationToken.None); var myDictionary = await TimeoutRetryHelper.Execute((token, state) => StateManager.GetOrAddAsync <IReliableDictionary <string, BrokerServiceState> >(messageTypeName)); var queueName = CreateQueueName(reference, messageTypeName); await TimeoutRetryHelper.ExecuteInTransaction(StateManager, async (tx, token, state) => { var subscribers = await myDictionary.TryGetValueAsync(tx, Subscribers, LockMode.Update); if (subscribers.HasValue) { var newState = BrokerServiceState.RemoveSubscriber(subscribers.Value, reference); await myDictionary.SetAsync(tx, Subscribers, newState); } await StateManager.RemoveAsync(tx, queueName); ServiceEventSourceMessage($"Unregistered subscriber: {reference.Name}"); _queues.TryRemove(queueName, out reference); await BrokerEventsManager.OnUnsubscribedAsync(queueName, reference, messageTypeName); }); }
/// <summary> /// Unregisters a Service or Actor <paramref name="reference"/> as subscriber for messages of type <paramref name="messageTypeName"/> /// </summary> /// <param name="reference"></param> /// <param name="messageTypeName"></param> /// <returns></returns> public async Task UnsubscribeAsync(ReferenceWrapper reference, string messageTypeName) { await WaitForInitializeAsync(CancellationToken.None); var brokerState = await TimeoutRetryHelper.Execute((token, state) => StateManager.GetOrAddAsync <IReliableDictionary <string, BrokerServiceState> >(messageTypeName)); await TimeoutRetryHelper.ExecuteInTransaction(StateManager, async (tx, token, state) => { var queueName = SubscriptionDetails.CreateQueueName(reference, messageTypeName); if (_subscriptions.TryGetValue(queueName, out var subscription)) { await brokerState.RemoveSubscription(tx, Subscribers, subscription.SubscriptionDetails); } await StateManager.RemoveAsync(tx, queueName); ServiceEventSourceMessage($"Unregistered subscriber: {reference.Name}"); _subscriptions.TryRemove(queueName, out _); await _brokerEventsManager.OnUnsubscribedAsync(queueName, reference, messageTypeName); }); }