public AzureTopicPublisher(IOptions <AzureBusTopicSettings> settings, AzureBusTopicManagement topicManagement,
                            ILogger <AzureTopicPublisher> logging)
 {
     _settings        = settings.Value;
     _topicManagement = topicManagement;
     _logger          = logging;
 }
Example #2
0
        public AzureTopicSubscriber(IOptions <AzureBusTopicSettings> settings, AzureBusTopicManagement queueManagement, ILogger <AzureTopicSubscriber> logging)
        {
            _settings        = settings.Value;
            _queueManagement = queueManagement;
            _logging         = logging;

            _source = new CancellationTokenSource();
            Task.Factory.StartNew(() =>
            {
                while (!_source.IsCancellationRequested)
                {
                    try
                    {
                        var action = _errorActions.Take(_source.Token);
                        try
                        {
                            action.ReCreate(_settings, _queueManagement);
                        }
                        catch (Exception exception)
                        {
                            logging.LogError(exception, "Unable to recreate subscription.");
                        }
                    }
                    catch (OperationCanceledException exception)
                    {
                        _logging.LogDebug(exception, "Stopping {className}", nameof(AzureTopicSubscriber));
                    }
                    catch (Exception exception)
                    {
                        _logging.LogError(exception, "Something went wrong while doing error actions.");
                    }
                }
            }, _source.Token);
        }
Example #3
0
            public void ReCreate(AzureBusTopicSettings settings, AzureBusTopicManagement queueManagement)
            {
                var topicName        = settings.TopicNameBuilder(typeof(T));
                var subscriptionName = $"{topicName}.{settings.TopicSubscriberId}";

                queueManagement.CreateSubscriptionIfMissing(topicName, subscriptionName, typeof(T));

                var subscriptionClient = new SubscriptionClient(settings.ConnectionString, topicName, subscriptionName);

                UpdateRules(subscriptionClient, settings);
            }
Example #4
0
            internal Binding(AzureBusTopicSettings settings, ILogger <AzureTopicSubscriber> logging,
                             AzureBusTopicManagement queueManagement, BlockingCollection <IBinding> errorActions)
            {
                _excludeTopicsFromLogging = new LoggingConfiguration().ExcludeTopicsFromLogging();
                var topicName        = settings.TopicNameBuilder(typeof(T));
                var subscriptionName = $"{topicName}.{settings.TopicSubscriberId}";

                queueManagement.CreateSubscriptionIfMissing(topicName, subscriptionName, typeof(T));

                var subscriptionClient = new SubscriptionClient(settings.ConnectionString, topicName, subscriptionName);

                UpdateRules(subscriptionClient, settings);

                subscriptionClient.RegisterMessageHandler(
                    async(message, _) =>
                {
                    try
                    {
                        var body = Encoding.UTF8.GetString(message.Body);

                        if (!_excludeTopicsFromLogging.Contains(topicName))
                        {
                            logging.LogInformation("Received '{subscription}': {body} with Azure MessageId: '{messageId}'", subscriptionName, body, message.MessageId);
                        }

                        var asObject = AsObject(body);

                        Subject.OnNext(asObject);
                    }
                    catch (Exception ex)
                    {
                        logging.LogError(ex, "Message {subscription}': {message} -> consumer error: {exception}", subscriptionName, message, ex);
                    }
                }, new MessageHandlerOptions(async e =>
                {
                    logging.LogError(e.Exception, "At route '{subscription}' error occurred: {exception}.", subscriptionName, e.Exception);
                    if (e.Exception is ServiceBusCommunicationException || e.Exception is MessagingEntityNotFoundException)
                    {
                        errorActions.Add(this);
                    }
                }));
            }
            internal Binding(
                AzureBusTopicSettings settings,
                AzureBusTopicManagement queueManagement,
                string topic,
                Type type,
                ILogger <AzureTopicPublisher> logger)
            {
                _logger   = logger;
                _settings = settings;
                _topic    = topic;
                _excludeTopicsFromLogging = new LoggingConfiguration().ExcludeTopicsFromLogging();
                queueManagement.CreateTopicIfMissing(_topic, type);

                var retryPolicy = new RetryExponential(
                    TimeSpan.FromSeconds(settings.AzureRetryMinimumBackoff),
                    TimeSpan.FromSeconds(settings.AzureRetryMaximumBackoff),
                    settings.AzureMaximumRetryCount
                    );

                _topicClient = new TopicClient(settings.ConnectionString, _topic, retryPolicy);
                _logger.LogInformation("Created new MQ binding '{topic}'.", _topic);
            }