コード例 #1
0
 public async Task DeleteQueueIfExists(string queueName)
 {
     if (await _namespaceManager.QueueExistsAsync(queueName))
     {
         await _namespaceManager.DeleteQueueAsync(queueName);
     }
 }
コード例 #2
0
        private static async Task DeployDataWorkerQueue(TextWriter writer, bool recreate = false)
        {
            // "dumpling-service data-worker queue path"
            // "dumpling-service bus connection string"
            var dataworkerQueuePath  = NearbyConfig.Settings["dumpling-service data-worker queue path"];
            var servicebusConnString = NearbyConfig.Settings["dumpling-service bus connection string"];

            NamespaceManager manager = NamespaceManager.CreateFromConnectionString(servicebusConnString);

            CreationDelegate createQueue = async() =>
            {
                writer.WriteLine("creating new dataworker queue");
                await manager.CreateQueueAsync(dataworkerQueuePath);
            };

            var exists = await manager.QueueExistsAsync(dataworkerQueuePath);

            if (exists && recreate)
            {
                writer.WriteLine("dataworker queue exists; deleting current instance");
                await manager.DeleteQueueAsync(dataworkerQueuePath);

                createQueue();
            }
            else if (!exists)
            {
                createQueue();
            }
            else
            {
                writer.WriteLine($"'{dataworkerQueuePath}' exists already and we're not recreating");
            }
        }
コード例 #3
0
 async Task CleanupSagaTopologyAsync(NamespaceManager namespaceManager, IEnumerable <QueueDescription> queues)
 {
     Console.WriteLine("Cleanup");
     foreach (var queueDescription in queues.Reverse())
     {
         await namespaceManager.DeleteQueueAsync(queueDescription.Path);
     }
 }
コード例 #4
0
        public async Task ServiceBus_Node_DoesNotExhaustConnections()
        {
            var connectionString     = Environment.GetEnvironmentVariable("AzureWebJobsServiceBus");
            NamespaceManager manager = NamespaceManager.CreateFromConnectionString(connectionString);

            // Start with an empty queue
            await manager.DeleteQueueAsync("node");

            // Pre-create the queue as we can end up with 409s if a bunch of requests
            // try to create the queue at once
            await manager.CreateQueueAsync("node");

            int i = 0, j = 0, lastConnectionCount = 0, lastConnectionLimit = 0;

            using (var client = CreateClient())
            {
                // make this longer as we'll start seeing long timeouts from Service Bus upon failure.
                client.Timeout = TimeSpan.FromMinutes(5);

                // max connections in dynamic is currently 300
                for (i = 0; i < 25; i++)
                {
                    List <Task <HttpResponseMessage> > requestTasks = new List <Task <HttpResponseMessage> >();

                    for (j = 0; j < 25; j++)
                    {
                        requestTasks.Add(client.GetAsync($"api/ServiceBusNode?code={_fixture.FunctionDefaultKey}"));
                    }

                    await Task.WhenAll(requestTasks);

                    foreach (var requestTask in requestTasks)
                    {
                        HttpResponseMessage response = await requestTask;
                        JObject             result   = await response.Content.ReadAsAsync <JObject>();

                        if (response.IsSuccessStatusCode)
                        {
                            // store these off for error details
                            lastConnectionCount = (int)result["connections"];
                            lastConnectionLimit = (int)result["connectionLimit"];

                            // make sure we have the correct limit
                            Assert.Equal(300, lastConnectionLimit);
                        }

                        Assert.True(response.IsSuccessStatusCode, $"Error: {response.StatusCode}, Last successful response: Connections: {lastConnectionCount}, ConnectionLimit: {lastConnectionLimit}");
                    }
                }
            }

            QueueDescription queueDescription = manager.GetQueue("node");

            Assert.Equal(i * j, queueDescription.MessageCountDetails.ActiveMessageCount);
        }
コード例 #5
0
        /// <summary>
        /// Scorches the entire namespace that the <see cref="NamespaceManager"/> is connected to.
        /// Currently this wipes out all queues and topics. This is used mostly by integration tests, to guarantee that
        /// both queue and topic creation processes are in place and working as intended.
        /// </summary>
        /// <param name="nsm">The <see cref="NamespaceManager"/> we are using to scorch the namespace.</param>
        /// <returns>The async <see cref="Task"/> wrapper.</returns>
        public static async Task ScorchNamespace(this NamespaceManager nsm)
        {
            foreach (var queue in await nsm.GetQueuesAsync())
            {
                await nsm.DeleteQueueAsync(queue.Path);
            }

            foreach (var topic in await nsm.GetTopicsAsync())
            {
                await nsm.DeleteTopicAsync(topic.Path);
            }
        }
コード例 #6
0
        /// <summary>
        /// Delete a Message Queue, if it exists, and indicate if the attempt was successful.
        /// </summary>
        public bool DeleteQueue()
        {
            string queueName   = EnvironmentType.MessageQueueName();
            bool   queueExists = QueueExists;

            if (queueExists)
            {
                _namespaceManager.DeleteQueueAsync(queueName).Wait();
                queueExists = QueueExists;
            }

            return(!queueExists);
        }
コード例 #7
0
        public override async Task DeleteQueueAsync()
        {
            if (await _namespaceManager.QueueExistsAsync(_options.Name).AnyContext())
            {
                await _namespaceManager.DeleteQueueAsync(_options.Name).AnyContext();
            }

            _queueClient      = null;
            _enqueuedCount    = 0;
            _dequeuedCount    = 0;
            _completedCount   = 0;
            _abandonedCount   = 0;
            _workerErrorCount = 0;
        }
コード例 #8
0
 public Task DeleteQueueAsync(QueueName name)
 {
     if (name.IsSimpleQueue)
     {
         return(_namespaceManager.DeleteQueueAsync(name.TopicName));
     }
     else
     {
         if (name.IsTopic)
         {
             return(_namespaceManager.DeleteTopicAsync(name.TopicName));
         }
         else
         {
             return(_namespaceManager.DeleteSubscriptionAsync(name.TopicName,
                                                              name.SubscriptionName));
         }
     }
 }
コード例 #9
0
        public override async Task DeleteQueueAsync()
        {
            if (await _namespaceManager.QueueExistsAsync(_queueName).AnyContext())
            {
                await _namespaceManager.DeleteQueueAsync(_queueName).AnyContext();
            }

            _queueDescription = new QueueDescription(_queueName)
            {
                MaxDeliveryCount = _retries + 1,
                LockDuration     = _workItemTimeout
            };

            await _namespaceManager.CreateQueueAsync(_queueDescription).AnyContext();

            _enqueuedCount    = 0;
            _dequeuedCount    = 0;
            _completedCount   = 0;
            _abandonedCount   = 0;
            _workerErrorCount = 0;
        }
コード例 #10
0
        public T SendAndRespond <T>(BrokeredMessage requestMessage)
        {
            var replyTo = Guid.NewGuid().ToString().Substring(0, 6);

            requestMessage.ReplyTo = replyTo;

            _namespaceMgr.CreateQueue(replyTo);

            var replyQueue = QueueClient.Create(replyTo);

            Send(requestMessage);

            //wait for response on the response queue
            var responseMessage = replyQueue.Receive();

            var body         = responseMessage.GetBody <Stream>();
            var streamReader = new StreamReader(body);
            var response     = JsonConvert.DeserializeObject <T>(streamReader.ReadToEnd());

            responseMessage.Complete();
            _namespaceMgr.DeleteQueueAsync(replyTo);

            return(response);
        }
コード例 #11
0
        static async Task DeleteEntities(NamespaceManager namespaceManager)
        {
            var queryQueues = namespaceManager.GetQueuesAsync();
            var queryTopics = namespaceManager.GetTopicsAsync();
            await Task.WhenAll(queryQueues, queryTopics)
            .ConfigureAwait(false);

            const int maxRetryAttempts = 5;
            var       deleteQueues     = (await queryQueues).Select(queueDescription => TryWithRetries(queueDescription.Path, namespaceManager.DeleteQueueAsync(queueDescription.Path), maxRetryAttempts));

            await Task.WhenAll(deleteQueues)
            .ConfigureAwait(false);

            var deleteTopics = (await queryTopics).Select(topicDescription => TryWithRetries(topicDescription.Path, namespaceManager.DeleteTopicAsync(topicDescription.Path), maxRetryAttempts));
            await Task.WhenAll(deleteTopics)
            .ConfigureAwait(false);
        }
 public Task DeleteQueue(string path)
 {
     return(manager.DeleteQueueAsync(path));
 }
コード例 #13
0
        public async Task Run(string namespaceAddress, string manageToken)
        {
            Console.WriteLine("\nCreating topology\n");
            this.sharedAccessRuleKey = SharedAccessAuthorizationRule.GenerateRandomKey();
            var namespaceManageTokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(manageToken);

            // Create namespace manager and create destination queue with a SAS rule that allows sending to that queue.
            var namespaceManager = new NamespaceManager(namespaceAddress, namespaceManageTokenProvider);

            var targetQueue = new QueueDescription("TargetQueue")
            {
                Authorization = { new SharedAccessAuthorizationRule("SendKey", this.sharedAccessRuleKey, new[] { AccessRights.Send }) },
            };

            targetQueue = (await namespaceManager.QueueExistsAsync(targetQueue.Path))
                ? await namespaceManager.UpdateQueueAsync(targetQueue)
                : await namespaceManager.CreateQueueAsync(targetQueue);

            var topic = new TopicDescription("SourceTopic")
            {
                Authorization = { new SharedAccessAuthorizationRule("SendKey", this.sharedAccessRuleKey, new[] { AccessRights.Send }) }
            };
            topic = (await namespaceManager.TopicExistsAsync(topic.Path))
                ? await namespaceManager.UpdateTopicAsync(topic)
                : await namespaceManager.CreateTopicAsync(topic);
            var forwardingSubscription = namespaceManager.CreateSubscription(
                new SubscriptionDescription(topic.Path, "Sub1")
                {
                    ForwardTo = targetQueue.Path
                });

            var forwardingQueue = new QueueDescription("SourceQueue")
            {
                ForwardTo = targetQueue.Path,
                Authorization =
                {
                    new SharedAccessAuthorizationRule(
                        "SendKey",
                        this.sharedAccessRuleKey,
                        new[] {AccessRights.Send})
                }
            };
            forwardingQueue = (await namespaceManager.QueueExistsAsync(forwardingQueue.Path))
                ? await namespaceManager.UpdateQueueAsync(forwardingQueue)
                : await namespaceManager.CreateQueueAsync(forwardingQueue);


            Console.WriteLine("\nSending messages\n");

            var topicFactory = MessagingFactory.Create(namespaceAddress, TokenProvider.CreateSharedAccessSignatureTokenProvider("SendKey", this.sharedAccessRuleKey));
            var topicSender = await topicFactory.CreateMessageSenderAsync(topic.Path);
            await topicSender.SendAsync(CreateMessage("M1"));

            var queueFactory = MessagingFactory.Create(namespaceAddress, TokenProvider.CreateSharedAccessSignatureTokenProvider("SendKey", this.sharedAccessRuleKey));
            var queueSender = await queueFactory.CreateMessageSenderAsync(forwardingQueue.Path);
            await queueSender.SendAsync(CreateMessage("M1"));


            var messagingFactory = MessagingFactory.Create(namespaceAddress, namespaceManageTokenProvider);
            var targetQueueReceiver = messagingFactory.CreateQueueClient(targetQueue.Path);
            while (true)
            {
                var message = await targetQueueReceiver.ReceiveAsync(TimeSpan.FromSeconds(10));
                if (message != null)
                {
                    await this.PrintReceivedMessage(message);
                    await message.CompleteAsync();
                }
                else
                {
                    break;
                }
            }
            await targetQueueReceiver.CloseAsync();

            Console.WriteLine("\nPress ENTER to delete topics and exit\n");
            Console.ReadLine();
            messagingFactory.Close();
            Task.WaitAll(
                namespaceManager.DeleteQueueAsync(targetQueue.Path),
                namespaceManager.DeleteQueueAsync(forwardingQueue.Path),
                namespaceManager.DeleteTopicAsync(topic.Path));
        }
コード例 #14
0
 async Task CleanupSagaTopologyAsync(NamespaceManager namespaceManager, IEnumerable<QueueDescription> queues)
 {
     Console.WriteLine("Cleanup");
     foreach (var queueDescription in queues.Reverse())
     {
         await namespaceManager.DeleteQueueAsync(queueDescription.Path);
     }
 }
コード例 #15
0
        public async Task Run(string namespaceAddress, string manageToken)
        {
            Console.WriteLine("\nCreating topology\n");
            this.sharedAccessRuleKey = SharedAccessAuthorizationRule.GenerateRandomKey();
            var namespaceManageTokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(manageToken);

            // Create namespace manager and create destination queue with a SAS rule that allows sending to that queue.
            var namespaceManager = new NamespaceManager(namespaceAddress, namespaceManageTokenProvider);

            var targetQueue = new QueueDescription("TargetQueue")
            {
                Authorization = { new SharedAccessAuthorizationRule("SendKey", this.sharedAccessRuleKey, new[] { AccessRights.Send }) },
            };

            targetQueue = (await namespaceManager.QueueExistsAsync(targetQueue.Path))
                ? await namespaceManager.UpdateQueueAsync(targetQueue)
                : await namespaceManager.CreateQueueAsync(targetQueue);

            var topic = new TopicDescription("SourceTopic")
            {
                Authorization = { new SharedAccessAuthorizationRule("SendKey", this.sharedAccessRuleKey, new[] { AccessRights.Send }) }
            };

            topic = (await namespaceManager.TopicExistsAsync(topic.Path))
                ? await namespaceManager.UpdateTopicAsync(topic)
                : await namespaceManager.CreateTopicAsync(topic);

            var forwardingSubscription = namespaceManager.CreateSubscription(
                new SubscriptionDescription(topic.Path, "Sub1")
            {
                ForwardTo = targetQueue.Path
            });

            var forwardingQueue = new QueueDescription("SourceQueue")
            {
                ForwardTo     = targetQueue.Path,
                Authorization =
                {
                    new SharedAccessAuthorizationRule(
                        "SendKey",
                        this.sharedAccessRuleKey,
                        new[] { AccessRights.Send })
                }
            };

            forwardingQueue = (await namespaceManager.QueueExistsAsync(forwardingQueue.Path))
                ? await namespaceManager.UpdateQueueAsync(forwardingQueue)
                : await namespaceManager.CreateQueueAsync(forwardingQueue);


            Console.WriteLine("\nSending messages\n");

            var topicFactory = MessagingFactory.Create(namespaceAddress, TokenProvider.CreateSharedAccessSignatureTokenProvider("SendKey", this.sharedAccessRuleKey));
            var topicSender  = await topicFactory.CreateMessageSenderAsync(topic.Path);

            await topicSender.SendAsync(CreateMessage("M1"));

            var queueFactory = MessagingFactory.Create(namespaceAddress, TokenProvider.CreateSharedAccessSignatureTokenProvider("SendKey", this.sharedAccessRuleKey));
            var queueSender  = await queueFactory.CreateMessageSenderAsync(forwardingQueue.Path);

            await queueSender.SendAsync(CreateMessage("M1"));


            var messagingFactory    = MessagingFactory.Create(namespaceAddress, namespaceManageTokenProvider);
            var targetQueueReceiver = messagingFactory.CreateQueueClient(targetQueue.Path);

            while (true)
            {
                var message = await targetQueueReceiver.ReceiveAsync(TimeSpan.FromSeconds(10));

                if (message != null)
                {
                    await this.PrintReceivedMessage(message);

                    await message.CompleteAsync();
                }
                else
                {
                    break;
                }
            }
            await targetQueueReceiver.CloseAsync();

            Console.WriteLine("\nPress ENTER to delete topics and exit\n");
            Console.ReadLine();
            messagingFactory.Close();
            Task.WaitAll(
                namespaceManager.DeleteQueueAsync(targetQueue.Path),
                namespaceManager.DeleteQueueAsync(forwardingQueue.Path),
                namespaceManager.DeleteTopicAsync(topic.Path));
        }
コード例 #16
0
 public async Task DeleteQueueAsync(string name)
 {
     var cleansedName = CreateQueueName(name);
     await _manager.DeleteQueueAsync(cleansedName);
 }
コード例 #17
0
 public async Task DeleteAsync()
 {
     await RetryPolicy.ExecuteAsync(() => NamespaceManager.DeleteQueueAsync(Client.Path));
 }
コード例 #18
0
 /// <summary>
 /// Delete Queue
 /// </summary>
 /// <returns></returns>
 public virtual async Task Delete()
 {
     await manager.DeleteQueueAsync(this.name);
 }