async Task <bool> SubscriptionIsReusedAcrossDifferentNamespaces(SubscriptionDescription subscriptionDescription, string sqlFilter, INamespaceManagerInternal namespaceManager) { var rules = await namespaceManager.GetRules(subscriptionDescription).ConfigureAwait(false); if (rules.First().Filter is SqlFilter filter && filter.SqlExpression != sqlFilter) { logger.Debug("Looks like this subscription name is already taken as the sql filter does not match the subscribed event name."); return(true); } return(false); }
public async Task DeleteSubscription(string topicPath, string subscriptionName, SubscriptionMetadataInternal metadata, string sqlFilter, INamespaceManagerInternal namespaceManager, string forwardTo) { var meta = metadata as ForwardingTopologySubscriptionMetadata; // var subscriptionDescription = subscriptionDescriptionFactory(topicPath, subscriptionName, settings); var subscriptionDescription = new SubscriptionDescription(topicPath, subscriptionName); try { if (await ExistsAsync(topicPath, subscriptionName, metadata.Description, namespaceManager, removeCacheEntry: true).ConfigureAwait(false)) { var ruleDescription = new RuleDescription { Filter = new SqlFilter(sqlFilter), Name = metadata.SubscriptionNameBasedOnEventWithNamespace }; logger.Info($"Removing subscription rule '{ruleDescription.Name}' for event '{meta.SubscribedEventFullName}'."); var subscriptionClient = SubscriptionClient.CreateFromConnectionString(meta.NamespaceInfo.ConnectionString, topicPath, subscriptionName); await subscriptionClient.RemoveRuleAsync(ruleDescription.Name).ConfigureAwait(false); var remainingRules = await namespaceManager.GetRules(subscriptionDescription).ConfigureAwait(false); if (!remainingRules.Any()) { await namespaceManager.DeleteSubscription(subscriptionDescription).ConfigureAwait(false); logger.Debug($"Subscription '{metadata.Description}' created as '{subscriptionDescription.Name}' was removed as part of unsubscribe since events are subscribed to."); } } } catch (MessagingException ex) { var loggedMessage = $"{(ex.IsTransient ? "Transient" : "Non transient")} {ex.GetType().Name} occurred on subscription '{subscriptionDescription.Name}' deletion for topic '{subscriptionDescription.TopicPath}' in namespace '{namespaceManager.Address.Host}'."; if (!ex.IsTransient) { logger.Fatal(loggedMessage, ex); throw; } logger.Info(loggedMessage, ex); } }
async Task <bool> SubscriptionIsReusedAcrossDifferentNamespaces(SubscriptionDescription subscriptionDescription, string sqlFilter, INamespaceManagerInternal namespaceManager) { var foundRules = await namespaceManager.GetRules(subscriptionDescription).ConfigureAwait(false); var rules = foundRules as RuleDescription[] ?? foundRules.ToArray(); if (rules.First().Filter is SqlFilter filter) { if (!filter.SqlExpression.Contains(sqlFilter)) { logger.Debug("Looks like this subscription name is already taken as the sql filter does not match the subscribed event name."); return(true); } if (sqlFilter.Length != filter.SqlExpression.Length && rules.Length == 1) { logger.Info($"SQL filter of the existing subscription '{subscriptionDescription.Name}' should be optimized.\nUpdate Rule filter from \"{filter.SqlExpression}\" to \"{sqlFilter}\"."); } } return(false); }