Exemplo n.º 1
0
        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);
        }