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); } }
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); }