Exemple #1
0
        private void AddRule(string[] rules)
        {
            NamespaceManager namespaceManager = NamespaceManager.CreateFromConnectionString(this.connectionString);
            var namespaceRules = namespaceManager.GetRules(this.topicName, this.subbscriptionName);

            foreach (var rule in namespaceRules)
            {
                subscriptionClient.RemoveRule(rule.Name);
            }

            if (namespaceRules.Where(f => f.Name == "$Default").SingleOrDefault() != null)
            {
                subscriptionClient.RemoveRule("$Default");
            }

            foreach (string rule in rules)
            {
                subscriptionClient.AddRule(new RuleDescription()
                {
                    Filter = new CorrelationFilter {
                        Label = rule
                    },
                    Name = rule
                });
            }
        }
Exemple #2
0
 private static void TryAddRule(SubscriptionClient client, RuleDescription rule)
 {
     // try / catch is because there could be other processes initializing at the same time.
     try {
         client.AddRule(rule);
     } catch (MessagingEntityAlreadyExistsException) { }
 }
Exemple #3
0
            private void UpdateRules(AzureTopicMqSettings settings)
            {
                _receiver.RemoveRule("$default");

                settings.AzureSubscriptionRules
                .ToList()
                .ForEach(x => _receiver.AddRule(x.Key, x.Value));
            }
        protected override void NewItem(string path, string type, object newItemValue)
        {
            string[] pathChunks = Context.ChunkPath(this.PSDriveInfo, path);
            string   name       = pathChunks[pathChunks.Length - 1];
            string   parentPath = path.Substring(0, path.LastIndexOf('\\'));

            pathChunks = Context.ChunkPath(this.PSDriveInfo, parentPath);

            // Find the root resource specified in the path
            switch (pathChunks.Length)
            {
            case 1:
                if (string.Compare(pathChunks[0], "Queues", true) == 0)
                {
                    this.ServiceBusNamespaceClient.CreateQueue(name);
                }
                else if (string.Compare(pathChunks[0], "Topics", true) == 0)
                {
                    this.ServiceBusNamespaceClient.CreateTopic(name);
                }

                break;

            case 2:
                if (string.Compare(pathChunks[0], "Topics", true) == 0)
                {
                    TopicDescription topic = (TopicDescription)this.GetItemAt(parentPath);
                    this.ServiceBusNamespaceClient.CreateSubscription(topic.Path, name);
                }

                break;

            case 3:
                if (string.Compare(pathChunks[0], "Topics", true) == 0)
                {
                    MessagingFactory        factory      = Context.GetMessagingFactory(this.SessionState);
                    SubscriptionDescription subscription = (SubscriptionDescription)this.GetItemAt(parentPath);
                    SubscriptionClient      client       = factory.CreateSubscriptionClient(subscription.TopicPath, subscription.Name);
                    client.AddRule(name, new Messaging.TrueFilter());
                }

                break;
            }

            Context.Cache.Remove(this.GetPathTillElement(path, pathChunks.Length));
        }
Exemple #5
0
 internal static void ReplaceFilter(this SubscriptionClient subscriptionClient, string filterName, string filterExpression)
 {
     try
     {
         subscriptionClient.RemoveRule(filterName);
     }
     catch (MessagingEntityNotFoundException)
     {
     }
     try
     {
         subscriptionClient.AddRule(filterName, new SqlFilter(filterExpression));
     }
     catch (MessagingEntityAlreadyExistsException)
     {
     }
 }
        private async Task InitializeSubscriptionAsync(string subscriptionName, string filter = "")
        {
            TopicDescription topic = await NamespaceManager.GetTopicAsync(TopicName);

            if (!await NamespaceManager.SubscriptionExistsAsync(topic.Path, subscriptionName))
            {
                return;
            }

            if (!_subscriptionClient.ContainsKey(subscriptionName))
            {
                SubscriptionClient client = SubscriptionClient.Create(TopicName, subscriptionName, ReceiveMode.PeekLock);
                if (!string.IsNullOrEmpty(filter))
                {
                    client.AddRule(new RuleDescription
                    {
                        Name   = "localrule",
                        Filter = new SqlFilter(filter),
                    });
                }
                _logger.WriteInfo(new LogMessage(string.Concat("Subscription ", subscriptionName, " has been activated")), LogCategories);
                _subscriptionClient.Add(subscriptionName, client);
            }
        }
        /// <summary>
        /// Calls <see cref="AzureServiceBus{TAuthenticationToken}.InstantiateReceiving()"/>
        /// then uses a <see cref="Task"/> to apply the <see cref="FilterKey"/> as a <see cref="RuleDescription"/>
        /// to the <see cref="SubscriptionClient"/> instances in <paramref name="serviceBusReceivers"/>.
        /// </summary>
        /// <param name="namespaceManager">The <see cref="NamespaceManager"/>.</param>
        /// <param name="serviceBusReceivers">The receivers collection to place <see cref="SubscriptionClient"/> instances into.</param>
        /// <param name="topicName">The topic name.</param>
        /// <param name="topicSubscriptionName">The topic subscription name.</param>
        protected override void InstantiateReceiving(NamespaceManager namespaceManager, IDictionary <int, SubscriptionClient> serviceBusReceivers, string topicName, string topicSubscriptionName)
        {
            base.InstantiateReceiving(namespaceManager, serviceBusReceivers, topicName, topicSubscriptionName);

            Task.Factory.StartNewSafely
                (() =>
            {
                // Because refreshing the rule can take a while, we only want to do this when the value changes
                string filter;
                if (!ConfigurationManager.TryGetSetting(FilterKeyConfigurationKey, out filter))
                {
                    return;
                }
                if (FilterKey.ContainsKey(topicName) && FilterKey[topicName] == filter)
                {
                    return;
                }
                FilterKey[topicName] = filter;

                // https://docs.microsoft.com/en-us/azure/application-insights/app-insights-analytics-reference#summarize-operator
                // http://www.summa.com/blog/business-blog/everything-you-need-to-know-about-azure-service-bus-brokered-messaging-part-2#rulesfiltersactions
                // https://github.com/Azure-Samples/azure-servicebus-messaging-samples/tree/master/TopicFilters
                SubscriptionClient client = serviceBusReceivers[0];
                bool reAddRule            = false;
                try
                {
                    IEnumerable <RuleDescription> rules = namespaceManager.GetRules(client.TopicPath, client.Name).ToList();
                    RuleDescription ruleDescription     = rules.SingleOrDefault(rule => rule.Name == "CqrsConfiguredFilter");
                    if (ruleDescription != null)
                    {
                        var sqlFilter = ruleDescription.Filter as SqlFilter;
                        if (sqlFilter == null && !string.IsNullOrWhiteSpace(filter))
                        {
                            reAddRule = true;
                        }
                        else if (sqlFilter != null && sqlFilter.SqlExpression != filter)
                        {
                            reAddRule = true;
                        }
                        if (sqlFilter != null && reAddRule)
                        {
                            client.RemoveRule("CqrsConfiguredFilter");
                        }
                    }
                    else if (!string.IsNullOrWhiteSpace(filter))
                    {
                        reAddRule = true;
                    }

                    ruleDescription = rules.SingleOrDefault(rule => rule.Name == "$Default");
                    // If there is a default rule and we have a rule, it will cause issues
                    if (!string.IsNullOrWhiteSpace(filter) && ruleDescription != null)
                    {
                        client.RemoveRule("$Default");
                    }
                    // If we don't have a rule and there is no longer a default rule, it will cause issues
                    else if (string.IsNullOrWhiteSpace(filter) && !rules.Any())
                    {
                        ruleDescription = new RuleDescription
                                          (
                            "$Default",
                            new SqlFilter("1=1")
                                          );
                        client.AddRule(ruleDescription);
                    }
                }
                catch (MessagingEntityNotFoundException)
                {
                }

                if (!reAddRule)
                {
                    return;
                }

                int loopCounter = 0;
                while (loopCounter < 10)
                {
                    try
                    {
                        RuleDescription ruleDescription = new RuleDescription
                                                          (
                            "CqrsConfiguredFilter",
                            new SqlFilter(filter)
                                                          );
                        client.AddRule(ruleDescription);
                        break;
                    }
                    catch (MessagingEntityAlreadyExistsException exception)
                    {
                        loopCounter++;
                        // Still waiting for the delete to complete
                        Thread.Sleep(1000);
                        if (loopCounter == 9)
                        {
                            Logger.LogError("Setting the filter failed as it already exists.", exception: exception);
                            TelemetryHelper.TrackException(exception);
                        }
                    }
                    catch (Exception exception)
                    {
                        Logger.LogError("Setting the filter failed.", exception: exception);
                        TelemetryHelper.TrackException(exception);
                        break;
                    }
                }
            });
        }
Exemple #8
0
        /// <summary>
        /// Calls <see cref="AzureServiceBus{TAuthenticationToken}.InstantiateReceiving()"/>
        /// then uses a <see cref="Task"/> to apply the <see cref="FilterKey"/> as a <see cref="RuleDescription"/>
        /// to the <see cref="IMessageReceiver"/> instances in <paramref name="serviceBusReceivers"/>.
        /// </summary>
        /// <param name="manager">The <see cref="Manager"/>.</param>
        /// <param name="serviceBusReceivers">The receivers collection to place <see cref="IMessageReceiver"/> instances into.</param>
        /// <param name="topicName">The topic name.</param>
        /// <param name="topicSubscriptionName">The topic subscription name.</param>
        protected override void InstantiateReceiving(Manager manager, IDictionary <int, IMessageReceiver> serviceBusReceivers, string topicName, string topicSubscriptionName)
        {
            base.InstantiateReceiving(manager, serviceBusReceivers, topicName, topicSubscriptionName);

            Task.Factory.StartNewSafely
                (() =>
            {
                // Because refreshing the rule can take a while, we only want to do this when the value changes
                string filter;
                if (!ConfigurationManager.TryGetSetting(FilterKeyConfigurationKey, out filter))
                {
                    return;
                }
                if (FilterKey.ContainsKey(topicName) && FilterKey[topicName] == filter)
                {
                    return;
                }
                FilterKey[topicName] = filter;

                // https://docs.microsoft.com/en-us/azure/application-insights/app-insights-analytics-reference#summarize-operator
                // http://www.summa.com/blog/business-blog/everything-you-need-to-know-about-azure-service-bus-brokered-messaging-part-2#rulesfiltersactions
                // https://github.com/Azure-Samples/azure-servicebus-messaging-samples/tree/master/TopicFilters
#if NET452
                SubscriptionClient client = serviceBusReceivers[0];
#endif
#if NETSTANDARD2_0
                // Since the IMessageReceiver and it's concrete implementation doesn't allow for the management of rules, we're creating a SubscriptionClient just to do the rules... it gets cleaned up somewhat below.
                SubscriptionClient client = new SubscriptionClient(ConnectionString, topicName, topicSubscriptionName);
#endif
                bool reAddRule = false;
                try
                {
#if NET452
                    IEnumerable <RuleDescription> rules = manager.GetRules(client.TopicPath, client.Name).ToList();
#endif
#if NETSTANDARD2_0
                    Task <IList <RuleDescription> > getRulesTask = manager.GetRulesAsync(client.TopicPath, client.SubscriptionName);
                    getRulesTask.Wait();
                    IEnumerable <RuleDescription> rules = getRulesTask.Result;
#endif
                    RuleDescription ruleDescription = rules.SingleOrDefault(rule => rule.Name == "CqrsConfiguredFilter");
                    if (ruleDescription != null)
                    {
                        var sqlFilter = ruleDescription.Filter as SqlFilter;
                        if (sqlFilter == null && !string.IsNullOrWhiteSpace(filter))
                        {
                            reAddRule = true;
                        }
                        else if (sqlFilter != null && sqlFilter.SqlExpression != filter)
                        {
                            reAddRule = true;
                        }
                        if (sqlFilter != null && reAddRule)
                        {
#if NET452
                            client.RemoveRule("CqrsConfiguredFilter");
#endif
#if NETSTANDARD2_0
                            client.RemoveRuleAsync("CqrsConfiguredFilter").Wait();
#endif
                        }
                    }
                    else if (!string.IsNullOrWhiteSpace(filter))
                    {
                        reAddRule = true;
                    }

                    ruleDescription = rules.SingleOrDefault(rule => rule.Name == "$Default");
                    // If there is a default rule and we have a rule, it will cause issues
                    if (!string.IsNullOrWhiteSpace(filter) && ruleDescription != null)
                    {
#if NET452
                        client.RemoveRule("$Default");
#endif
#if NETSTANDARD2_0
                        client.RemoveRuleAsync("$Default").Wait();
#endif
                    }
                    // If we don't have a rule and there is no longer a default rule, it will cause issues
                    else if (string.IsNullOrWhiteSpace(filter) && !rules.Any())
                    {
                        ruleDescription = new RuleDescription
                                          (
                            "$Default",
                            new SqlFilter("1=1")
                                          );
#if NET452
                        client.AddRule(ruleDescription);
#endif
#if NETSTANDARD2_0
                        client.AddRuleAsync(ruleDescription).Wait();
#endif
                    }
                }
                catch (AggregateException ex)
                {
                    if (!(ex.InnerException is MessagingEntityNotFoundException))
                    {
                        throw;
                    }
                }
                catch (MessagingEntityNotFoundException)
                {
                }

                if (!reAddRule)
                {
                    return;
                }

                int loopCounter = 0;
                while (loopCounter < 10)
                {
                    try
                    {
                        RuleDescription ruleDescription = new RuleDescription
                                                          (
                            "CqrsConfiguredFilter",
                            new SqlFilter(filter)
                                                          );
#if NET452
                        client.AddRule(ruleDescription);
#endif
#if NETSTANDARD2_0
                        client.AddRuleAsync(ruleDescription).Wait();
#endif
                        break;
                    }
                    catch (MessagingEntityAlreadyExistsException exception)
                    {
                        loopCounter++;
                        // Still waiting for the delete to complete
                        Thread.Sleep(1000);
                        if (loopCounter == 9)
                        {
                            Logger.LogError("Setting the filter failed as it already exists.", exception: exception);
                            TelemetryHelper.TrackException(exception);
                        }
                    }
                    catch (Exception exception)
                    {
                        Logger.LogError("Setting the filter failed.", exception: exception);
                        TelemetryHelper.TrackException(exception);
                        break;
                    }
                }

#if NETSTANDARD2_0
                client.CloseAsync();
#endif
            });
        }
 public MessageSubscriber()
 {
     Client = SubscriptionClient.Create(TopicName, SubscriptionName);
     Client.AddRule(new RuleDescription("testrule"));
 }
 private static void TryAddRule(SubscriptionClient client, RuleDescription rule)
 {
     // try / catch is because there could be other processes initializing at the same time.
     try
     {
         client.AddRule(rule);
     }
     catch (MessagingEntityAlreadyExistsException) { }
 }