private void EnsureTopicClientsCreated()
        {
            if (_topicClients != null)
            {
                return;
            }

            lock (_locker)
            {
                if (_topicClients != null)
                {
                    return;
                }

                var topicClients  = new Dictionary <string, TopicClient>();
                var configuration = _configurationService.Get <AzureServiceBusConfiguration>();

                foreach (var topic in configuration.Topics)
                {
                    var topicName   = _topicNameFormatter.GetTopicName(topic.TopicName);
                    var topicClient = TopicClient.CreateFromConnectionString(configuration.ConnectionString, topicName);

                    topicClients.Add(topic.MessageType, topicClient);
                }

                _topicClients = topicClients;
            }
        }
        private void CheckAzureServiceBusMessageCounts()
        {
            _logger.Info("Checking Azure Service Bus Message counts");

            var serviceBusConfiguration = _configurationService.Get <AzureServiceBusConfiguration>();
            var namespaceManager        = NamespaceManager.CreateFromConnectionString(serviceBusConfiguration.ConnectionString);

            foreach (var topicConfiguration in serviceBusConfiguration.Topics)
            {
                var topicName = _topicNameFormatter.GetTopicName(topicConfiguration.TopicName);

                var topicMessageCountDetails = GetTopicMessageCountDetails(
                    namespaceManager, topicName);

                foreach (var subscriptionConfiguration in topicConfiguration.Subscriptions)
                {
                    var subscriptionPath = string.Format("{0}/{1}",
                                                         topicName, subscriptionConfiguration.SubscriptionName);

                    var messageCountWarningLimit =
                        subscriptionConfiguration.MessageCountWarningLimit ??
                        serviceBusConfiguration.DefaultMessageCountWarningLimit;

                    var deadLetterMessageCountWarningLimit =
                        subscriptionConfiguration.DeadLetterMessageCountWarningLimit ??
                        serviceBusConfiguration.DefaultDeadLetterMessageCountWarningLimit;

                    _logger.Debug("Limits for topic/subscription {0} are {1} active and {2} dead-lettered messages",
                                  subscriptionPath, messageCountWarningLimit, deadLetterMessageCountWarningLimit);

                    var subscriptionMessageCountDetails = GetSubscriptionMessageCountDetails(
                        namespaceManager, topicName, subscriptionConfiguration.SubscriptionName);

                    var messageCountNarrative = string.Format("Found {0} active, {1} scheduled and {2} dead-lettered message(s) for topic/subscription: {3}",
                                                              subscriptionMessageCountDetails.ActiveMessageCount,
                                                              topicMessageCountDetails.ScheduledMessageCount,
                                                              subscriptionMessageCountDetails.DeadLetterMessageCount,
                                                              subscriptionPath);

                    if (subscriptionMessageCountDetails.ActiveMessageCount >= messageCountWarningLimit ||
                        subscriptionMessageCountDetails.DeadLetterMessageCount >= deadLetterMessageCountWarningLimit)
                    {
                        _logger.Warn(messageCountNarrative);
                    }
                    else
                    {
                        _logger.Info(messageCountNarrative);
                    }
                }
            }

            _logger.Info("Checked Azure Service Bus Message counts");
        }
        public void Initialise()
        {
            _logService.Debug("Initialising...");

            var configuration    = _configurationService.Get <AzureServiceBusConfiguration>();
            var namespaceManager = NamespaceManager.CreateFromConnectionString(configuration.ConnectionString);

            foreach (var topic in configuration.Topics)
            {
                var topicName = _topicNameFormatter.GetTopicName(topic.TopicName);
                if (!namespaceManager.TopicExists(topicName))
                {
                    var topicDescription = new TopicDescription(topicName);

                    try
                    {
                        _logService.Info("Creating topic '{0}'", topicName);

                        namespaceManager.CreateTopic(topicDescription);

                        _logService.Info("Created topic '{0}'", topicName);
                    }
                    catch (MessagingEntityAlreadyExistsException)
                    {
                        _logService.Info("Topic already exists '{0}'", topicName);
                    }
                }

                foreach (var subscription in topic.Subscriptions)
                {
                    if (!namespaceManager.SubscriptionExists(topicName, subscription.SubscriptionName))
                    {
                        try
                        {
                            _logService.Info("Creating subscription '{0}/{1}'", topicName, subscription.SubscriptionName);

                            namespaceManager.CreateSubscription(topicName, subscription.SubscriptionName);

                            _logService.Info("Created subscription '{0}/{1}'", topicName, subscription.SubscriptionName);
                        }
                        catch (MessagingEntityAlreadyExistsException)
                        {
                            _logService.Info("Subscription already exists '{0}/{1}'", topicName, subscription.SubscriptionName);
                        }
                    }
                }
            }

            _logService.Debug("Initialised");
        }
Esempio n. 4
0
        private SubscriberInfo SubscribeOne(IServiceBusSubscriber <TMessage> subscriber)
        {
            string topicName;
            string subscriptionName;

            if (!TryGetSubscriberTopicSubscriptionNames(subscriber, out topicName, out subscriptionName))
            {
                throw new InvalidOperationException(string.Format(
                                                        "No subscriber topic/subscription attribute specified for type '{0}'", typeof(TMessage).FullName));
            }

            var serviceBusConfiguration = _configurationService.Get <AzureServiceBusConfiguration>();

            var subscriptionConfiguration = serviceBusConfiguration.Topics
                                            .Where(each => each.TopicName == topicName)
                                            .SelectMany(each => each.Subscriptions)
                                            .FirstOrDefault(each => each.SubscriptionName == subscriptionName);

            if (subscriptionConfiguration == null)
            {
                _logService.Info(
                    "No subscriber configuration found for topic/subscription \"{0}/{1}\", will use default configuration",
                    topicName, subscriptionName);

                subscriptionConfiguration = new AzureServiceBusSubscriptionConfiguration();
            }

            //Ensure topic name is correctly formatted after its configuration has been retrieved
            topicName = _topicNameFormatter.GetTopicName(topicName);

            var subscriptionPath = string.Format("{0}/{1}", topicName, subscriptionConfiguration.SubscriptionName);

            _logService.Info("Subscribing to topic/subscription '{0}'", subscriptionPath);

            var topicClient = _clientFactory.CreateFromConnectionString(
                serviceBusConfiguration.ConnectionString, topicName);

            var options = new OnMessageOptions
            {
                MaxConcurrentCalls =
                    subscriptionConfiguration.MaxConcurrentMessagesPerNode ??
                    serviceBusConfiguration.DefaultMaxConcurrentMessagesPerNode,
                AutoComplete = false
            };

            options.ExceptionReceived += LogSubscriptionClientException;

            var subscriptionClient = _clientFactory.CreateFromConnectionString(
                serviceBusConfiguration.ConnectionString,
                topicName,
                subscriptionConfiguration.SubscriptionName,
                ReceiveMode.PeekLock);

            var subscriberInfo = new SubscriberInfo
            {
                SubscriptionPath   = subscriptionPath,
                TopicClient        = topicClient,
                SubscriptionClient = subscriptionClient,
                Subscriber         = subscriber
            };

            subscriptionClient.OnMessage(brokeredMessage => ConsumeMessage(subscriberInfo, brokeredMessage), options);

            _logService.Info("Subscribed to topic/subscription '{0}' with max of {1} concurrent call(s) per node",
                             subscriptionPath, options.MaxConcurrentCalls);

            return(subscriberInfo);
        }