public ASBConsumerTests()
        {
            var command = new ASBTestCommand()
            {
                CommandValue  = "Do the things.",
                CommandNumber = 26
            };

            _correlationId = Guid.NewGuid();
            _channelName   = $"Consumer-Tests-{Guid.NewGuid()}".Truncate(50);
            _topicName     = $"Consumer-Tests-{Guid.NewGuid()}";
            var routingKey = new RoutingKey(_topicName);

            AzureServiceBusSubscription <ASBTestCommand> subscription = new(
                name : new SubscriptionName(_channelName),
                channelName : new ChannelName(_channelName),
                routingKey : routingKey
                );

            _contentType = "application/json";

            _message = new Message(
                new MessageHeader(command.Id, _topicName, MessageType.MT_COMMAND, _correlationId, contentType: _contentType),
                new MessageBody(JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))
                );

            _subscriptionConfiguration = new AzureServiceBusSubscriptionConfiguration()
            {
                DeadLetteringOnMessageExpiration = true,
                DefaultMessageTimeToLive         = TimeSpan.FromDays(4),
                LockDuration     = TimeSpan.FromMinutes(3),
                MaxDeliveryCount = 7,
                SqlFilter        = "1=1"
            };

            var clientProvider = ASBCreds.ASBClientProvider;

            _administrationClient = new AdministrationClientWrapper(clientProvider);
            _administrationClient.CreateSubscription(_topicName, _channelName, _subscriptionConfiguration);

            _serviceBusClient = clientProvider.GetServiceBusClient();

            var channelFactory =
                new AzureServiceBusChannelFactory(new AzureServiceBusConsumerFactory(clientProvider, false));

            _channel = channelFactory.CreateChannel(subscription);

            _producerRegistry = new AzureServiceBusProducerRegistryFactory(
                clientProvider,
                new AzureServiceBusPublication[]
            {
                new AzureServiceBusPublication {
                    Topic = new RoutingKey(_topicName)
                }
            }
                )
                                .Create();
        }
Example #2
0
        public AzureServiceBusSubscriptionClient(
            IAzureServiceBusPersistentConnection persistentConnection,
            ILogger <AzureServiceBusClient> logger,
            IOptions <AzureServiceBusSubscriptionConfiguration> configuration,
            IServiceProvider serviceProvider,
            IConfiguration globalConfiguration)
        {
            Guard.Argument(persistentConnection, nameof(persistentConnection)).NotNull();
            _serviceProvider = serviceProvider;

            _configuration = Guard.Argument(configuration, nameof(configuration)).NotNull().Value.Value;

            _logger = Guard.Argument(logger, nameof(logger)).NotNull().Value;

            _serviceProvider = Guard.Argument(serviceProvider, nameof(serviceProvider)).NotNull().Value;

            var subscriptionInfo = new AzureSubscriptionClientModel();

            globalConfiguration.Bind(typeof(TEvent).Name, subscriptionInfo);

            _subscriptionClient = persistentConnection.CreateSubscriptionClient(subscriptionInfo.TopicName, subscriptionInfo.SubscriptionName);
        }
Example #3
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);
        }
 public AzureServiceBusTopicConfiguration()
 {
     Subscriptions = new AzureServiceBusSubscriptionConfiguration[0];
 }
        private async Task CreateSubscriptionAsync(string topicName, string subscriptionName, AzureServiceBusSubscriptionConfiguration subscriptionConfiguration)
        {
            s_logger.LogInformation("Creating subscription {ChannelName} for topic {Topic}...", subscriptionName, topicName);

            if (!TopicExists(topicName))
            {
                CreateTopic(topicName);
            }

            var subscriptionOptions = new CreateSubscriptionOptions(topicName, subscriptionName)
            {
                MaxDeliveryCount = subscriptionConfiguration.MaxDeliveryCount,
                DeadLetteringOnMessageExpiration = subscriptionConfiguration.DeadLetteringOnMessageExpiration,
                LockDuration             = subscriptionConfiguration.LockDuration,
                DefaultMessageTimeToLive = subscriptionConfiguration.DefaultMessageTimeToLive
            };

            var ruleOptions = string.IsNullOrEmpty(subscriptionConfiguration.SqlFilter)
                ? new CreateRuleOptions() : new CreateRuleOptions("sqlFilter", new SqlRuleFilter(subscriptionConfiguration.SqlFilter));

            try
            {
                await _administrationClient.CreateSubscriptionAsync(subscriptionOptions, ruleOptions);
            }
            catch (Exception e)
            {
                s_logger.LogError(e, "Failed to create subscription {ChannelName} for topic {Topic}.", subscriptionName, topicName);
                throw;
            }

            s_logger.LogInformation("Subscription {ChannelName} for topic {Topic} created.", subscriptionName, topicName);
        }
 /// <summary>
 /// Create a Subscription.
 /// </summary>
 /// <param name="topicName">The name of the Topic.</param>
 /// <param name="subscriptionName">The name of the Subscription.</param>
 /// <param name="subscriptionConfiguration">The configuration options for the subscriptions.</param>
 public void CreateSubscription(string topicName, string subscriptionName, AzureServiceBusSubscriptionConfiguration subscriptionConfiguration)
 {
     CreateSubscriptionAsync(topicName, subscriptionName, subscriptionConfiguration).Wait();
 }