private static async Task ListenLoopExecuted(
            Queue <Func <Task> > actions,
            IMessageProcessingStrategy messageProcessingStrategy)
        {
            var initalActionCount = (double)actions.Count;
            var timeout           = MinTaskDuration + TimeSpan.FromMilliseconds(initalActionCount / 100);
            var stopwatch         = Stopwatch.StartNew();

            while (actions.Any())
            {
                var batch = GetFromFakeSnsQueue(actions, messageProcessingStrategy.MaxConcurrency);

                if (batch.Count < 1)
                {
                    break;
                }

                foreach (var action in batch)
                {
                    (await messageProcessingStrategy.StartWorkerAsync(action, CancellationToken.None)).ShouldBeTrue();
                }

                messageProcessingStrategy.MaxConcurrency.ShouldBeGreaterThanOrEqualTo(0);

                (await messageProcessingStrategy.WaitForAvailableWorkerAsync()).ShouldBeGreaterThan(0);
                messageProcessingStrategy.MaxConcurrency.ShouldBeGreaterThan(0);
            }
        }
Beispiel #2
0
        private async Task <int> GetDesiredNumberOfMessagesToRequestFromSqsAsync()
        {
            int maximumMessagesFromAws = MessageConstants.MaxAmazonMessageCap;
            int maximumWorkers         = _messageProcessingStrategy.MaxConcurrency;

            int messagesToRequest = Math.Min(maximumWorkers, maximumMessagesFromAws);

            if (messagesToRequest < 1)
            {
                // Wait for the strategy to have at least one worker available
                int availableWorkers = await _messageProcessingStrategy.WaitForAvailableWorkerAsync().ConfigureAwait(false);

                messagesToRequest = Math.Min(availableWorkers, maximumMessagesFromAws);
            }

            if (messagesToRequest < 1)
            {
                _log.LogWarning("No workers are available to process SQS messages.");
                messagesToRequest = 0;
            }

            return(messagesToRequest);
        }