private static async Task <ServiceBusAdministrationClient> Cleanup(string connectionString, string inputQueue,
                                                                           string topicName, string rushSubscription, string currencySubscription)
        {
            var client = new ServiceBusAdministrationClient(connectionString);

            if (await client.SubscriptionExistsAsync(topicName, rushSubscription))
            {
                await client.DeleteSubscriptionAsync(topicName, rushSubscription);
            }

            if (await client.SubscriptionExistsAsync(topicName, currencySubscription))
            {
                await client.DeleteSubscriptionAsync(topicName, currencySubscription);
            }

            if (await client.TopicExistsAsync(topicName))
            {
                await client.DeleteTopicAsync(topicName);
            }

            var topicDescription = new CreateTopicOptions(topicName);
            await client.CreateTopicAsync(topicDescription);

            if (await client.QueueExistsAsync(inputQueue))
            {
                await client.DeleteQueueAsync(inputQueue);
            }

            var queueDescription = new CreateQueueOptions(inputQueue);
            await client.CreateQueueAsync(queueDescription);

            return(client);
        }
        private async Task CreateSubscriptionIfNotExistsAsync(string topicName, string subscriptionName, CancellationToken cancellationToken)
        {
            // if entity creation is not enabled, just return
            if (!TransportOptions.EnableEntityCreation)
            {
                Logger.LogTrace("Entity creation is diabled. Subscription creation skipped");
                return;
            }

            // If the subscription does not exist, create it
            Logger.LogDebug("Checking if subscription '{SubscriptionName}' under topic '{TopicName}' exists",
                            subscriptionName,
                            topicName);
            if (!await managementClient.SubscriptionExistsAsync(topicName, subscriptionName, cancellationToken))
            {
                Logger.LogTrace("Subscription '{SubscriptionName}' under topic '{TopicName}' does not exist, preparing creation.",
                                subscriptionName,
                                topicName);
                var options = new CreateSubscriptionOptions(topicName: topicName, subscriptionName: subscriptionName)
                {
                    // set the defaults for a subscription here
                    Status           = EntityStatus.Active,
                    MaxDeliveryCount = 10,
                };

                // Allow for the defaults to be overriden
                TransportOptions.SetupSubscriptionOptions?.Invoke(options);
                Logger.LogInformation("Creating subscription '{SubscriptionName}' under topic '{TopicName}'",
                                      subscriptionName,
                                      topicName);
                await managementClient.CreateSubscriptionAsync(options : options, cancellationToken : cancellationToken);
            }
        }
 private static async Task Setup(this ServiceBusAdministrationClient admin, string topic, string subscription)
 {
     if (!(await admin.SubscriptionExistsAsync(topic, subscription)).Value)
     {
         await admin.CreateSubscriptionAsync(topic, subscription);
     }
 }
예제 #4
0
        private async Task CreateTopicSubscriptionAsync(CancellationToken cancellationToken)
        {
            ServiceBusAdministrationClient serviceBusClient = await Settings.GetServiceBusAdminClientAsync();

            string entityPath = await Settings.GetEntityPathAsync();

            try
            {
                bool subscriptionExists = await serviceBusClient.SubscriptionExistsAsync(entityPath, SubscriptionName, cancellationToken);

                if (subscriptionExists)
                {
                    Logger.LogTrace("Topic subscription with name '{SubscriptionName}' already exists on Service Bus resource", SubscriptionName);
                }
                else
                {
                    Logger.LogTrace("Creating subscription '{SubscriptionName}' on topic '{TopicPath}'...", SubscriptionName, entityPath);

                    var subscriptionDescription = new CreateSubscriptionOptions(entityPath, SubscriptionName)
                    {
                        UserMetadata = $"Subscription created by Arcus job: '{JobId}' to process Service Bus messages."
                    };
                    var ruleDescription = new CreateRuleOptions("Accept-All", new TrueRuleFilter());
                    await serviceBusClient.CreateSubscriptionAsync(subscriptionDescription, ruleDescription, cancellationToken)
                    .ConfigureAwait(continueOnCapturedContext: false);

                    Logger.LogTrace("Subscription '{SubscriptionName}' created on topic '{TopicPath}'", SubscriptionName, entityPath);
                }
            }
            catch (Exception exception)
            {
                Logger.LogWarning(exception, "Failed to create topic subscription with name '{SubscriptionName}' on Service Bus resource", SubscriptionName);
            }
        }
 async Task DeleteSubscriptionAsync()
 {
     if (await _sbAdminClient.SubscriptionExistsAsync(_topicName, _subscriptionName))
     {
         await _sbAdminClient.DeleteSubscriptionAsync(_topicName, _subscriptionName);
     }
 }
예제 #6
0
        private async Task DeleteTopicSubscriptionAsync(CancellationToken cancellationToken)
        {
            ServiceBusAdministrationClient serviceBusClient = await Settings.GetServiceBusAdminClientAsync();

            string entityPath = await Settings.GetEntityPathAsync();

            try
            {
                bool subscriptionExists = await serviceBusClient.SubscriptionExistsAsync(entityPath, SubscriptionName, cancellationToken);

                if (subscriptionExists)
                {
                    Logger.LogTrace("Deleting subscription '{SubscriptionName}' on topic '{Path}'...", SubscriptionName, entityPath);
                    await serviceBusClient.DeleteSubscriptionAsync(entityPath, SubscriptionName, cancellationToken);

                    Logger.LogTrace("Subscription '{SubscriptionName}' deleted on topic '{Path}'", SubscriptionName, entityPath);
                }
                else
                {
                    Logger.LogTrace("Cannot delete topic subscription with name '{SubscriptionName}' because no subscription exists on Service Bus resource", SubscriptionName);
                }
            }
            catch (Exception exception)
            {
                Logger.LogWarning(exception, "Failed to delete topic subscription with name '{SubscriptionName}' on Service Bus resource", SubscriptionName);
            }
        }
        /// <summary>
        /// Check if a Subscription Exists for a Topic.
        /// </summary>
        /// <param name="topicName">The name of the Topic.</param>
        /// <param name="subscriptionName">The name of the Subscription</param>
        /// <returns>True if the subscription exists on the specified Topic.</returns>
        public bool SubscriptionExists(string topicName, string subscriptionName)
        {
            s_logger.LogDebug("Checking if subscription {ChannelName} for topic {Topic} exists...", subscriptionName, topicName);

            bool result;

            try
            {
                result = _administrationClient.SubscriptionExistsAsync(topicName, subscriptionName).Result;
            }
            catch (Exception e)
            {
                s_logger.LogError(e, "Failed to check if subscription {ChannelName} for topic {Topic} exists.", subscriptionName, topicName);
                throw;
            }

            if (result)
            {
                s_logger.LogDebug("Subscription {ChannelName} for topic {Topic} exists.", subscriptionName, topicName);
            }
            else
            {
                s_logger.LogWarning("Subscription {ChannelName} for topic {Topic} does not exist.", subscriptionName, topicName);
            }

            return(result);
        }
예제 #8
0
    public static async Task SetupSubscriptionAsync(this ServiceBusAdministrationClient client, string topicName, string subscriptionName)
    {
        await client.SetupTopicAsync(topicName);

        if (!await client.SubscriptionExistsAsync(topicName, subscriptionName))
        {
            await client.CreateSubscriptionAsync(topicName, subscriptionName);
        }
    }
예제 #9
0
        public static async Task DeleteSubscription(string connectionString, string topic, string subscription)
        {
            var client = new ServiceBusAdministrationClient(connectionString);

            bool subscriptionExists = await client.SubscriptionExistsAsync(topic, subscription);

            if (subscriptionExists)
            {
                await client.DeleteSubscriptionAsync(topic, subscription);
            }
        }
예제 #10
0
        private void CreateSubscriptions(string topicName, string[] subscriptions)
        {
            var busAdmin = new ServiceBusAdministrationClient(Connections.ServiceBusConnectionString);

            foreach (var subscription in subscriptions)
            {
                if (!busAdmin.SubscriptionExistsAsync(topicName, subscription).Result.Value)
                {
                    busAdmin.CreateSubscriptionAsync(topicName, subscription).Wait();
                }
            }
        }
    async Task EnsureInitializationAsync()
    {
        if (!await adminClient.TopicExistsAsync(this.TopicName))
        {
            await adminClient.CreateTopicAsync(new CreateTopicOptions(this.TopicName)); /*Explore more options*/
        }

        if (!await adminClient.SubscriptionExistsAsync(this.TopicName, this.SubscriptionName))
        {
            await adminClient.CreateSubscriptionAsync(this.TopicName, this.SubscriptionName);
        }
    }
예제 #12
0
        public static async Task CreateSubscription(ServiceBusAdministrationClient client, string topic, string subscription)
        {
            CheckIsNotGreaterThan(nameof(subscription), subscription.Length, 50);

            bool subscriptionExists = await client.SubscriptionExistsAsync(topic, subscription);

            if (!subscriptionExists)
            {
                var options = new CreateSubscriptionOptions(topic, subscription);

                _ = await client.CreateSubscriptionAsync(options);
            }
        }
        public async Task SetupAsync(IHost host)
        {
            using var scope = host.Services.CreateScope();

            var referenceFactory = scope.ServiceProvider.GetRequiredService <IQueueReferenceFactory>();
            var policy           = referenceFactory.Create <TM>();

            var azureConfig = scope.ServiceProvider.GetRequiredService <AzureServiceBusConfiguration>();
            var adminClient = new ServiceBusAdministrationClient(azureConfig.ConnectionString);

            if (!(await adminClient.TopicExistsAsync(policy.TopicName)))
            {
                await adminClient.CreateTopicAsync(policy.TopicName);
            }

            if (!(await adminClient.SubscriptionExistsAsync(policy.TopicName, policy.SubscriptionName)))
            {
                await adminClient.CreateSubscriptionAsync(policy.TopicName, policy.SubscriptionName);
            }
        }
        public async Task SetupAsync(IHost host)
        {
            using var scope = host.Services.CreateScope();

            var referenceFactory = scope.ServiceProvider.GetRequiredService <IQueueReferenceFactory>();
            var policy           = referenceFactory.Create <TM>();

            var azureConfig = scope.ServiceProvider.GetRequiredService <AzureServiceBusConfiguration>();
            var adminClient = new ServiceBusAdministrationClient(azureConfig.ConnectionString);

            try
            {
                if (!await adminClient.TopicExistsAsync(policy.TopicName))
                {
                    await adminClient.CreateTopicAsync(new CreateTopicOptions(policy.TopicName)
                    {
                        RequiresDuplicateDetection = true
                    });
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            try
            {
                if (!await adminClient.SubscriptionExistsAsync(policy.TopicName, policy.SubscriptionName))
                {
                    await adminClient.CreateSubscriptionAsync(policy.TopicName, policy.SubscriptionName);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
예제 #15
0
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            if (Subscription == null)
            {
                if (!await _administrationClient.QueueExistsAsync(QueueOrTopic, cancellationToken))
                {
                    await _administrationClient.CreateQueueAsync(QueueOrTopic, cancellationToken);
                }
            }
            else
            {
                if (!await _administrationClient.TopicExistsAsync(QueueOrTopic, cancellationToken))
                {
                    await _administrationClient.CreateTopicAsync(QueueOrTopic, cancellationToken);
                }

                if (!await _administrationClient.SubscriptionExistsAsync(QueueOrTopic, Subscription, cancellationToken))
                {
                    await _administrationClient.CreateSubscriptionAsync(QueueOrTopic, Subscription, cancellationToken);
                }
            }

            await _processor.StartProcessingAsync(cancellationToken);
        }
예제 #16
0
        public async Task EnsureTopicSubscription(
            string topicName,
            string subscriptionName,
            CancellationToken cancellationToken = default,
            string sqlFilterRule = "1=1")
        {
            try
            {
                if (!await _administrationClient.SubscriptionExistsAsync(topicName, subscriptionName, cancellationToken))
                {
                    const string defaultRuleName = "$Default";

                    var subscriptionOptions = new CreateSubscriptionOptions(topicName, subscriptionName)
                    {
                        Status           = EntityStatus.Active,
                        MaxDeliveryCount = 10,
                        LockDuration     = TimeSpan.FromSeconds(60)
                    };

                    var filterOptions = new CreateRuleOptions
                    {
                        Name   = defaultRuleName,
                        Filter = new SqlRuleFilter(string.IsNullOrWhiteSpace(sqlFilterRule) ? "1=1" : sqlFilterRule)
                    };

                    await _administrationClient.CreateSubscriptionAsync(subscriptionOptions, filterOptions, cancellationToken);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Service Bus ensure topic subscription operation failure");

                throw new ServiceBusSubscriberOperationException(
                          "Service Bus ensure topic subscription operation failure", ex);
            }
        }
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            _cancellationToken = cancellationToken;
            _client            = await _clientFactory.GetReceiverClient <TTopic, IEventSubscription <TTopic> >(_subscription, new ServiceBusProcessorOptions
            {
                AutoCompleteMessages       = false,
                MaxAutoLockRenewalDuration = Settings.MessageLockTimeout,
                MaxConcurrentCalls         = Settings.MaxConcurrentCalls,
                PrefetchCount = Settings.PrefetchCount,
                ReceiveMode   = ServiceBusReceiveMode.PeekLock
            }).ConfigureAwait(false);


            var topicName = AutoMessageMapper.GetQueueName <TTopic>();

            if (!await _managementClient.TopicExistsAsync(topicName, cancellationToken).ConfigureAwait(false))
            {
                try
                {
                    var serviceBusCreationOptions = GetServiceBusCreationOptions();

                    await _managementClient.CreateTopicAsync(new CreateTopicOptions(topicName)
                    {
                        EnablePartitioning      = serviceBusCreationOptions.EnablePartitioning,
                        EnableBatchedOperations = serviceBusCreationOptions.EnableBatchedOperations,
                        SupportOrdering         = serviceBusCreationOptions.SupportOrdering
                    }, cancellationToken).ConfigureAwait(false);
                }
                catch (ServiceBusException e)
                {
                    _log.Error(e, "Failed to create topic {TopicName}", topicName);
                    throw;
                }
            }
            if (!await _managementClient.SubscriptionExistsAsync(topicName, _subscription.Name, cancellationToken).ConfigureAwait(false))
            {
                try
                {
                    var serviceBusCreationOptions = GetServiceBusCreationOptions();

                    await _managementClient.CreateSubscriptionAsync(new CreateSubscriptionOptions(topicName, _subscription.Name)
                    {
                        EnableBatchedOperations = serviceBusCreationOptions.EnableBatchedOperations
                    }, cancellationToken).ConfigureAwait(false);
                }
                catch (ServiceBusException e)
                {
                    _log.Error(e, "Failed to create subscription {TopicName} {SubscriptionName}", topicName, _subscription.Name);
                    throw;
                }
            }

            _deadLetterLimit = Settings.DeadLetterDeliveryLimit;

            _client.ProcessMessageAsync += ClientOnProcessMessageAsync;
            _client.ProcessErrorAsync   += ClientOnProcessErrorAsync;

            await _client.StartProcessingAsync(cancellationToken);

#pragma warning disable 4014
            // ReSharper disable once MethodSupportsCancellation
            Task.Run(async() =>
            {
                _cancellationToken.WaitHandle.WaitOne();
                //Cancellation requested
                try
                {
                    _log.Information($"Closing ServiceBus channel receiver for {typeof(TTopic).Name}");
                    await _client.CloseAsync(CancellationToken.None);
                }
                catch (Exception)
                {
                    //Swallow
                }
            });
#pragma warning restore 4014
        }
예제 #18
0
        public ServiceBusQueue(string connectionString, string topicName, string subscription, ServiceBusReceiveMode receiveMode = ServiceBusReceiveMode.PeekLock, bool createQueueIfItDoesNotExist = true)
            : base(connectionString)
        {
            this.connectionString = connectionString;
            this.queueName        = topicName;
            this.topicName        = topicName;
            this.subscription     = subscription;
            this.receiveMode      = receiveMode;
            this.SubQueue         = SubQueue.None;
            busAdmin = new ServiceBusAdministrationClient(this.connectionString);

            if (createQueueIfItDoesNotExist && !busAdmin.TopicExistsAsync(topicName).Result.Value)
            {
                busAdmin.CreateTopicAsync(topicName).Wait();
            }

            if (createQueueIfItDoesNotExist && !string.IsNullOrEmpty(subscription) && !busAdmin.SubscriptionExistsAsync(topicName, subscription).Result.Value)
            {
                busAdmin.CreateSubscriptionAsync(topicName, subscription).Wait();
            }
        }