public async Task <SubscriptionDescription> CreateTopicSubscription(SubscriptionDescription description, RuleDescription rule, Filter filter) { var subscriptionExists = await _namespaceManager.SubscriptionExistsAsync(description.TopicPath, description.SubscriptionName).ConfigureAwait(false); SubscriptionDescription subscriptionDescription = null; if (subscriptionExists) { subscriptionDescription = await _namespaceManager.GetSubscriptionAsync(description.TopicPath, description.SubscriptionName).ConfigureAwait(false); if (string.IsNullOrWhiteSpace(description.ForwardTo)) { if (!string.IsNullOrWhiteSpace(subscriptionDescription.ForwardTo)) { if (_log.IsWarnEnabled) { _log.WarnFormat("Removing invalid subscription: {0} ({1} -> {2})", subscriptionDescription.SubscriptionName, subscriptionDescription.TopicPath, subscriptionDescription.ForwardTo); } await _namespaceManager.DeleteSubscriptionAsync(description.TopicPath, description.SubscriptionName).ConfigureAwait(false); } } else { var forwardTo = subscriptionDescription.ForwardTo; var address = _namespaceManager.Address.ToString(); if (forwardTo.StartsWith(address)) { forwardTo = forwardTo.Substring(address.Length).Trim('/'); } if (description.ForwardTo.Equals(forwardTo)) { if (_log.IsDebugEnabled) { _log.DebugFormat("Updating subscription: {0} ({1} -> {2})", subscriptionDescription.SubscriptionName, subscriptionDescription.TopicPath, subscriptionDescription.ForwardTo); } await _namespaceManager.UpdateSubscriptionAsync(description).ConfigureAwait(false); } else { if (_log.IsWarnEnabled) { _log.WarnFormat("Removing invalid subscription: {0} ({1} -> {2})", subscriptionDescription.SubscriptionName, subscriptionDescription.TopicPath, subscriptionDescription.ForwardTo); } await _namespaceManager.DeleteSubscriptionAsync(description.TopicPath, description.SubscriptionName).ConfigureAwait(false); } } } else { try { if (_log.IsDebugEnabled) { _log.DebugFormat("Creating subscription {0} -> {1}", description.TopicPath, description.ForwardTo); } subscriptionDescription = rule != null ? await _namespaceManager.CreateSubscriptionAsync(description, rule).ConfigureAwait(false) : filter != null ? await _namespaceManager.CreateSubscriptionAsync(description, filter).ConfigureAwait(false) : await _namespaceManager.CreateSubscriptionAsync(description).ConfigureAwait(false); } catch (MessagingEntityAlreadyExistsException) { subscriptionDescription = await _namespaceManager.GetSubscriptionAsync(description.TopicPath, description.SubscriptionName).ConfigureAwait(false); } } if (_log.IsDebugEnabled) { _log.DebugFormat("Subscription: {0} ({1} -> {2})", subscriptionDescription.SubscriptionName, subscriptionDescription.TopicPath, subscriptionDescription.ForwardTo); } return(subscriptionDescription); }
public async Task <SubscriptionDescription> CreateTopicSubscription(SubscriptionDescription description, RuleDescription rule, Filter filter) { var create = true; SubscriptionDescription subscriptionDescription = null; try { subscriptionDescription = await _namespaceManager.GetSubscriptionAsync(description.TopicPath, description.SubscriptionName) .ConfigureAwait(false); string NormalizeForwardTo(string forwardTo) { if (string.IsNullOrEmpty(forwardTo)) { return(string.Empty); } var address = _namespaceManager.Address.ToString(); return(forwardTo.Replace(address, string.Empty).Trim('/')); } var targetForwardTo = NormalizeForwardTo(description.ForwardTo); var currentForwardTo = NormalizeForwardTo(subscriptionDescription.ForwardTo); if (!targetForwardTo.Equals(currentForwardTo)) { if (_log.IsDebugEnabled) { _log.DebugFormat("Updating subscription: {0} ({1} -> {2})", subscriptionDescription.SubscriptionName, subscriptionDescription.TopicPath, subscriptionDescription.ForwardTo); } await _namespaceManager.UpdateSubscriptionAsync(description).ConfigureAwait(false); } if (rule != null) { RuleDescription ruleDescription = await _namespaceManager.GetRuleAsync(description.TopicPath, description.SubscriptionName, rule.Name) .ConfigureAwait(false); if (rule.Name == ruleDescription.Name && (rule.Filter != ruleDescription.Filter || rule.Action != ruleDescription.Action)) { if (_log.IsDebugEnabled) { _log.DebugFormat("Updating subscription Rule: {0} ({1} -> {2})", rule.Name, ruleDescription.Filter.ToString(), rule.Filter.ToString()); } await _namespaceManager.UpdateRuleAsync(description.TopicPath, description.SubscriptionName, rule).ConfigureAwait(false); } } create = false; } catch (MessagingEntityNotFoundException) { } if (create) { var created = false; try { if (_log.IsDebugEnabled) { _log.DebugFormat("Creating subscription {0} -> {1}", description.TopicPath, description.ForwardTo); } subscriptionDescription = rule != null ? await _namespaceManager.CreateSubscriptionAsync(description, rule).ConfigureAwait(false) : filter != null ? await _namespaceManager.CreateSubscriptionAsync(description, filter).ConfigureAwait(false) : await _namespaceManager.CreateSubscriptionAsync(description).ConfigureAwait(false); created = true; } catch (MessagingEntityAlreadyExistsException) { } if (!created) { subscriptionDescription = await _namespaceManager.GetSubscriptionAsync(description.TopicPath, description.SubscriptionName) .ConfigureAwait(false); } } if (_log.IsDebugEnabled) { _log.DebugFormat("Subscription: {0} ({1} -> {2})", subscriptionDescription.SubscriptionName, subscriptionDescription.TopicPath, subscriptionDescription.ForwardTo); } return(subscriptionDescription); }