public async Task Init(Func <MessageContext, Task> onMessage, Func <ErrorContext, Task <ErrorHandleResult> > onError, CriticalError criticalError, PushSettings settings) { receiveStrategy = receiveStrategyFactory(settings.RequiredTransactionMode); peekCircuitBreaker = new RepeatedFailuresOverTimeCircuitBreaker("SqlPeek", waitTimeCircuitBreaker, ex => criticalError.Raise("Failed to peek " + settings.InputQueue, ex)); receiveCircuitBreaker = new RepeatedFailuresOverTimeCircuitBreaker("ReceiveText", waitTimeCircuitBreaker, ex => criticalError.Raise("Failed to receive from " + settings.InputQueue, ex)); inputQueue = queueFactory(settings.InputQueue); errorQueue = queueFactory(settings.ErrorQueue); receiveStrategy.Init(inputQueue, errorQueue, onMessage, onError, criticalError); if (settings.PurgeOnStartup) { try { var purgedRowsCount = await queuePurger.Purge(inputQueue).ConfigureAwait(false); Logger.InfoFormat("{0:N} messages purged from queue {1}", purgedRowsCount, settings.InputQueue); } catch (Exception ex) { Logger.Warn("Failed to purge input queue on startup.", ex); } } await schemaInspector.PerformInspection(inputQueue).ConfigureAwait(false); }
public async Task <int> Peek(TableBasedQueue inputQueue, RepeatedFailuresOverTimeCircuitBreaker circuitBreaker, CancellationToken cancellationToken) { var messageCount = 0; try { using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }, TransactionScopeAsyncFlowOption.Enabled)) using (var connection = await connectionFactory.OpenNewConnection().ConfigureAwait(false)) { messageCount = await inputQueue.TryPeek(connection, cancellationToken).ConfigureAwait(false); circuitBreaker.Success(); if (messageCount == 0) { Logger.Debug($"Input queue empty. Next peek operation will be delayed for {settings.Delay}."); await Task.Delay(settings.Delay, cancellationToken).ConfigureAwait(false); } scope.Complete(); } } catch (OperationCanceledException) { //Graceful shutdown } catch (SqlException e) when(cancellationToken.IsCancellationRequested) { Logger.Debug("Exception thown while performing cancellation", e); } catch (Exception ex) { Logger.Warn("Sql peek operation failed", ex); await circuitBreaker.Failure(ex).ConfigureAwait(false); } return(messageCount); }