public AzureTopicPublisher(IOptions <AzureBusTopicSettings> settings, AzureBusTopicManagement topicManagement, ILogger <AzureTopicPublisher> logging) { _settings = settings.Value; _topicManagement = topicManagement; _logger = logging; }
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); }
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); }
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); }