コード例 #1
0
        public async Task <QueueDescription> CreateQueue(QueueDescription queueDescription)
        {
            var create = true;

            try
            {
                queueDescription = await _namespaceManager.GetQueueAsync(queueDescription.Path).ConfigureAwait(false);

                create = false;
            }
            catch (MessagingEntityNotFoundException)
            {
            }

            if (create)
            {
                var created = false;
                try
                {
                    LogContext.Debug?.Log("Creating queue {Queue}", queueDescription.Path);

                    queueDescription = await _namespaceManager.CreateQueueAsync(queueDescription).ConfigureAwait(false);

                    created = true;
                }
                catch (MessagingEntityAlreadyExistsException)
                {
                }
                catch (MessagingException mex)
                {
                    if (mex.Message.Contains("(409)"))
                    {
                    }
                    else
                    {
                        throw;
                    }
                }

                if (!created)
                {
                    queueDescription = await _namespaceManager.GetQueueAsync(queueDescription.Path).ConfigureAwait(false);
                }
            }

            LogContext.Debug?.Log("Queue: {Queue} ({Attributes})", queueDescription.Path,
                                  string.Join(", ",
                                              new[]
            {
                queueDescription.EnableExpress ? "express" : "",
                queueDescription.RequiresDuplicateDetection ? "dupe detect" : "",
                queueDescription.EnableDeadLetteringOnMessageExpiration ? "dead letter" : "",
                queueDescription.RequiresSession ? "session" : ""
            }.Where(x => !string.IsNullOrWhiteSpace(x))));

            return(queueDescription);
        }
コード例 #2
0
        public async Task Disable(string queueName)
        {
            var queue = await _namespaceManager.GetQueueAsync(queueName);

            if (queue.Status == EntityStatus.Disabled)
            {
                return;
            }
            queue.Status = EntityStatus.Disabled;
            await _namespaceManager.UpdateQueueAsync(queue);
        }
コード例 #3
0
        public async Task <long> AddWordToQueueAsync(QueueClient queueClient, string queueName, string word)
        {
            Debug.Assert(null != _namespaceManager);
            var message = new BrokeredMessage(word);

            await queueClient.SendAsync(message).ConfigureAwait(false);

            var queue = await _namespaceManager.GetQueueAsync(queueName).ConfigureAwait(false);

            return(queue.MessageCount);
        }
コード例 #4
0
 async Task <IEnumerable <QueueDescription> > SetupSagaTopologyAsync(NamespaceManager nm)
 {
     Console.WriteLine("Setup");
     return(new List <QueueDescription>
     {
         await nm.QueueExistsAsync(SagaResultQueueName)
             ? await nm.GetQueueAsync(SagaResultQueueName)
             : await nm.CreateQueueAsync(SagaResultQueueName),
         await nm.QueueExistsAsync(CancelFlightQueueName)
             ? await nm.GetQueueAsync(CancelFlightQueueName)
             : await nm.CreateQueueAsync(new QueueDescription(CancelFlightQueueName)),
         await nm.QueueExistsAsync(BookFlightQueueName)
             ? await nm.GetQueueAsync(BookFlightQueueName)
             : await nm.CreateQueueAsync(
             new QueueDescription(BookFlightQueueName)
         {
             // on failure, we move deadletter messages off to the flight
             // booking compensator's queue
             EnableDeadLetteringOnMessageExpiration = true,
             ForwardDeadLetteredMessagesTo = CancelFlightQueueName
         }),
         await nm.QueueExistsAsync(CancelHotelQueueName)
             ? await nm.GetQueueAsync(CancelHotelQueueName)
             : await nm.CreateQueueAsync(new QueueDescription(CancelHotelQueueName)),
         await nm.QueueExistsAsync(BookHotelQueueName)
             ? await nm.GetQueueAsync(BookHotelQueueName)
             : await nm.CreateQueueAsync(
             new QueueDescription(BookHotelQueueName)
         {
             // on failure, we move deadletter messages off to the hotel
             // booking compensator's queue
             EnableDeadLetteringOnMessageExpiration = true,
             ForwardDeadLetteredMessagesTo = CancelHotelQueueName
         }),
         await nm.QueueExistsAsync(CancelRentalCarQueueName)
             ? await nm.GetQueueAsync(CancelRentalCarQueueName)
             : await nm.CreateQueueAsync(new QueueDescription(CancelRentalCarQueueName)),
         await nm.QueueExistsAsync(BookRentalCarQueueName)
             ? await nm.GetQueueAsync(BookRentalCarQueueName)
             : await nm.CreateQueueAsync(
             new QueueDescription(BookRentalCarQueueName)
         {
             // on failure, we move deadletter messages off to the car rental
             // compensator's queue
             EnableDeadLetteringOnMessageExpiration = true,
             ForwardDeadLetteredMessagesTo = CancelRentalCarQueueName
         }),
         await nm.QueueExistsAsync(SagaInputQueueName)
             ? await nm.GetQueueAsync(SagaInputQueueName)
             : await nm.CreateQueueAsync(
             new QueueDescription(SagaInputQueueName)
         {
             // book car is the first step
             ForwardTo = BookRentalCarQueueName
         })
     });
 }
コード例 #5
0
 private async Task <QueueDescription> GetOrCreateQueueDescriptionAsync()
 {
     try
     {
         return(await _namespaceManager.GetQueueAsync(_path).ConfigureAwait(false));
     }
     catch (MessagingEntityNotFoundException)
     {
         return(await _namespaceManager.CreateQueueAsync(_path).ConfigureAwait(false));
     }
 }
コード例 #6
0
        protected override async Task <QueueStats> GetQueueStatsImplAsync()
        {
            var q = await _namespaceManager.GetQueueAsync(_options.Name).AnyContext();

            return(new QueueStats {
                Queued = q.MessageCount,
                Working = 0,
                Deadletter = q.MessageCountDetails.DeadLetterMessageCount,
                Enqueued = _enqueuedCount,
                Dequeued = _dequeuedCount,
                Completed = _completedCount,
                Abandoned = _abandonedCount,
                Errors = _workerErrorCount,
                Timeouts = 0
            });
        }
コード例 #7
0
        private async Task <bool> QueueUpdateEntityStatusAsync(
            string queueName,
            EntityStatus entityStatus)
        {
            bool statusChanged = false;

            try
            {
                if (namespaceManager.QueueExists(queueName))
                {
                    var queue = await namespaceManager.GetQueueAsync(queueName);

                    var queueStatus = queue.Status;
                    if (queueStatus != entityStatus)
                    {
                        var queueDescription = new QueueDescription(queueName)
                        {
                            Status = entityStatus
                        };
                        await namespaceManager.UpdateQueueAsync(queueDescription);

                        statusChanged = true;

                        logger.LogInformation($"Queue {queueName} changed status from {queueStatus} to {entityStatus}.");
                    }
                }
                else
                {
                    logger.LogCritical($"Failed to change status for queue {queueName} to {entityStatus}. Queue does not exist.");
                }
            }
            catch (Exception ex)
            {
                logger.LogCritical(ex, $"Failed to change status for queue {queueName} to {entityStatus}.");
            }

            return(statusChanged);
        }
コード例 #8
0
 private async Task <QueueDescription> GetQueueDescriptionAsync()
 {
     return(await RetryPolicy.ExecuteAsync(async() => await NamespaceManager.GetQueueAsync(Client.Path)));
 }
コード例 #9
0
ファイル: AzureServiceBusQueue.cs プロジェクト: nj/Foundatio
        protected override async Task EnsureQueueCreatedAsync(CancellationToken cancellationToken = new CancellationToken())
        {
            if (_queueClient != null)
            {
                return;
            }

            using (await _lock.LockAsync(cancellationToken).AnyContext()) {
                if (_queueClient != null)
                {
                    return;
                }

                QueueDescription queueDescription;
                if (!await _namespaceManager.QueueExistsAsync(_queueName).AnyContext())
                {
                    try {
                        queueDescription = await _namespaceManager.CreateQueueAsync(new QueueDescription(_queueName) {
                            MaxDeliveryCount         = _retries + 1,
                            LockDuration             = _workItemTimeout,
                            AutoDeleteOnIdle         = _autoDeleteOnIdle,
                            DefaultMessageTimeToLive = _defaultMessageTimeToLive
                        }).AnyContext();
                    }
                    catch (MessagingException) {
                        queueDescription = await _namespaceManager.GetQueueAsync(_queueName).AnyContext();
                    }
                }
                else
                {
                    queueDescription = await _namespaceManager.GetQueueAsync(_queueName).AnyContext();

                    bool changes = false;

                    int newMaxDeliveryCount = _retries + 1;
                    if (queueDescription.MaxDeliveryCount != newMaxDeliveryCount)
                    {
                        queueDescription.MaxDeliveryCount = newMaxDeliveryCount;
                        changes = true;
                    }

                    if (queueDescription.LockDuration != _workItemTimeout)
                    {
                        queueDescription.LockDuration = _workItemTimeout;
                        changes = true;
                    }

                    if (queueDescription.AutoDeleteOnIdle != _autoDeleteOnIdle)
                    {
                        queueDescription.AutoDeleteOnIdle = _autoDeleteOnIdle;
                        changes = true;
                    }

                    if (queueDescription.DefaultMessageTimeToLive != _defaultMessageTimeToLive)
                    {
                        queueDescription.DefaultMessageTimeToLive = _defaultMessageTimeToLive;
                        changes = true;
                    }

                    if (changes)
                    {
                        await _namespaceManager.UpdateQueueAsync(queueDescription).AnyContext();
                    }
                }

                _queueClient = QueueClient.CreateFromConnectionString(_connectionString, queueDescription.Path);

                if (_retryPolicy != null)
                {
                    _queueClient.RetryPolicy = _retryPolicy;
                }
            }
        }
コード例 #10
0
 private async Task <QueueDescription> GetQueueAsync()
 {
     return(await NamespaceManager.GetQueueAsync(QueueName));
 }
        public async Task <long> GetMessageCount()
        {
            var queue = await _namespaceManager.GetQueueAsync(_queueName);

            return(queue.MessageCount);
        }
コード例 #12
0
        public static async Task <QueueDescription> CreateQueueSafeAsync(this NamespaceManager namespaceManager, QueueDescription queueDescription)
        {
            bool create = true;

            try
            {
                queueDescription = await namespaceManager.GetQueueAsync(queueDescription.Path).ConfigureAwait(false);

                create = false;
            }
            catch (MessagingEntityNotFoundException)
            {
            }

            if (create)
            {
                bool created = false;
                try
                {
                    if (_log.IsDebugEnabled)
                    {
                        _log.DebugFormat("Creating queue {0}", queueDescription.Path);
                    }

                    queueDescription = await namespaceManager.CreateQueueAsync(queueDescription).ConfigureAwait(false);

                    created = true;
                }
                catch (MessagingEntityAlreadyExistsException)
                {
                }
                catch (MessagingException mex)
                {
                    if (mex.Message.Contains("(409)"))
                    {
                    }
                    else
                    {
                        throw;
                    }
                }

                if (!created)
                {
                    queueDescription = await namespaceManager.GetQueueAsync(queueDescription.Path).ConfigureAwait(false);
                }
            }

            if (_log.IsDebugEnabled)
            {
                _log.DebugFormat("Queue: {0} ({1})", queueDescription.Path,
                                 string.Join(", ", new[]
                {
                    queueDescription.EnableExpress ? "express" : "",
                    queueDescription.RequiresDuplicateDetection ? "dupe detect" : "",
                    queueDescription.EnableDeadLetteringOnMessageExpiration ? "dead letter" : ""
                }.Where(x => !string.IsNullOrWhiteSpace(x))));
            }

            return(queueDescription);
        }
コード例 #13
0
 public async Task <QueueDescription> GetQueueAsync(string path)
 {
     return(await _namespaceManager.GetQueueAsync(path));
 }
コード例 #14
0
 async Task<IEnumerable<QueueDescription>> SetupSagaTopologyAsync(NamespaceManager nm)
 {
     Console.WriteLine("Setup");
     return new List<QueueDescription>
     {
         await nm.QueueExistsAsync(SagaResultQueueName)
             ? await nm.GetQueueAsync(SagaResultQueueName)
             : await nm.CreateQueueAsync(SagaResultQueueName),
         await nm.QueueExistsAsync(CancelFlightQueueName)
             ? await nm.GetQueueAsync(CancelFlightQueueName)
             : await nm.CreateQueueAsync(new QueueDescription(CancelFlightQueueName)),
         await nm.QueueExistsAsync(BookFlightQueueName)
             ? await nm.GetQueueAsync(BookFlightQueueName)
             : await nm.CreateQueueAsync(
                 new QueueDescription(BookFlightQueueName)
                 {
                     // on failure, we move deadletter messages off to the flight 
                     // booking compensator's queue
                     EnableDeadLetteringOnMessageExpiration = true,
                     ForwardDeadLetteredMessagesTo = CancelFlightQueueName
                 }),
         await nm.QueueExistsAsync(CancelHotelQueueName)
             ? await nm.GetQueueAsync(CancelHotelQueueName)
             : await nm.CreateQueueAsync(new QueueDescription(CancelHotelQueueName)),
         await nm.QueueExistsAsync(BookHotelQueueName)
             ? await nm.GetQueueAsync(BookHotelQueueName)
             : await nm.CreateQueueAsync(
                 new QueueDescription(BookHotelQueueName)
                 {
                     // on failure, we move deadletter messages off to the hotel 
                     // booking compensator's queue
                     EnableDeadLetteringOnMessageExpiration = true,
                     ForwardDeadLetteredMessagesTo = CancelHotelQueueName
                 }),
         await nm.QueueExistsAsync(CancelRentalCarQueueName)
             ? await nm.GetQueueAsync(CancelRentalCarQueueName)
             : await nm.CreateQueueAsync(new QueueDescription(CancelRentalCarQueueName)),
         await nm.QueueExistsAsync(BookRentalCarQueueName)
             ? await nm.GetQueueAsync(BookRentalCarQueueName)
             : await nm.CreateQueueAsync(
                 new QueueDescription(BookRentalCarQueueName)
                 {
                     // on failure, we move deadletter messages off to the car rental 
                     // compensator's queue
                     EnableDeadLetteringOnMessageExpiration = true,
                     ForwardDeadLetteredMessagesTo = CancelRentalCarQueueName
                 }),
         await nm.QueueExistsAsync(SagaInputQueueName)
             ? await nm.GetQueueAsync(SagaInputQueueName)
             : await nm.CreateQueueAsync(
                 new QueueDescription(SagaInputQueueName)
                 {
                     // book car is the first step
                     ForwardTo = BookRentalCarQueueName
                 })
     };
 }
 public Task <QueueDescription> GetQueue(string path)
 {
     return(manager.GetQueueAsync(path));
 }