public Task StartReceive(CancellationToken cancellationToken = default) { maximumConcurrency = limitations.MaxConcurrency; concurrencyLimiter = new SemaphoreSlim(maximumConcurrency, maximumConcurrency); messagePumpCancellationTokenSource = new CancellationTokenSource(); messageProcessingCancellationTokenSource = new CancellationTokenSource(); circuitBreaker = new RepeatedFailuresOverTimeCircuitBreaker("AzureStorageQueue-MessagePump", TimeToWaitBeforeTriggering, ex => criticalErrorAction("Failed to receive message from Azure Storage Queue.", ex, messageProcessingCancellationTokenSource.Token)); Logger.DebugFormat($"Starting MessageReceiver {Id} with max concurrency: {0}", maximumConcurrency); var receiverConfigurations = MessagePumpHelpers.DetermineReceiverConfiguration(receiveBatchSize, degreeOfReceiveParallelism, maximumConcurrency); messagePumpTasks = new Task[receiverConfigurations.Count]; for (var i = 0; i < receiverConfigurations.Count; i++) { var backoffStrategy = new BackoffStrategy(peekInterval, maximumWaitTime); var batchSizeForReceive = receiverConfigurations[i].BatchSize; // Task.Run() so the call returns immediately instead of waiting for the first await or return down the call stack messagePumpTasks[i] = Task.Run(() => PumpMessagesAndSwallowExceptions(batchSizeForReceive, backoffStrategy, messagePumpCancellationTokenSource.Token), CancellationToken.None); } return(Task.CompletedTask); }
public void Start(PushRuntimeSettings limitations) { maximumConcurrency = limitations.MaxConcurrency; concurrencyLimiter = new SemaphoreSlim(maximumConcurrency, maximumConcurrency); cancellationTokenSource = new CancellationTokenSource(); var receiverConfigurations = MessagePumpHelpers.DetermineReceiverConfiguration(receiveBatchSize, degreeOfReceiveParallelism, maximumConcurrency); messagePumpTasks = new Task[receiverConfigurations.Count]; cancellationToken = cancellationTokenSource.Token; for (var i = 0; i < receiverConfigurations.Count; i++) { var backoffStrategy = new BackoffStrategy(peekInterval, maximumWaitTime); var batchSizeForReceive = receiverConfigurations[i].BatchSize; messagePumpTasks[i] = Task.Run(() => ProcessMessages(batchSizeForReceive, backoffStrategy), CancellationToken.None); } }