public async Task HandleAsync(ProcessAsyncEventsJob job, CancellationToken cancellationToken)
        {
            Logger.Trace($"Starting to process async event queue '{job.QueueName}' with {job.AttemptsLeft} attempts left");

            try
            {
                await asyncEventWorker.RunQueueBacklogAsync(job.QueueName);
            }
            catch (AsyncEventProcessingSequenceException e)
            {
                Logger.Debug(e, $"AsyncEventProcessingSequenceException occurred during asynchronous queue processing");
                await ScheduleRetryAsync(job);
            }
            catch (OptimisticConcurrencyException e)
            {
                Logger.Warn(e, $"Optimistic concurrency exception occurred while processing '{job.QueueName}' async event queue");
                await ScheduleRetryAsync(job);
            }
            catch (Exception e)
            {
                Logger.Error(e, $"Unhandled exception occurred while processing '{job.QueueName}' async event queue");
                throw;
            }

            // TODO handle transient I/O errors with retries
            Logger.Trace($"Finished processing async event queue '{job.QueueName}'");
        }
Example #2
0
        public async Task RunQueueBacklogAsync(string queueName)
        {
            asyncEventWorkerLockCache.EnsureInitialized();
            await asyncEventWorkerLockCache.EnterQueueAsync(queueName);

            try
            {
                await asyncEventWorkerImplementation.RunQueueBacklogAsync(queueName);
            }
            finally
            {
                asyncEventWorkerLockCache.ExitQueue(queueName);
            }
        }