Exemplo n.º 1
0
        public virtual async Task CanRunQueueJobWithLockFailAsync()
        {
            const int workItemCount    = 10;
            const int allowedLockCount = 5;

            using (var queue = GetSampleWorkItemQueue(retries: 3, retryDelay: TimeSpan.Zero)) {
                await queue.DeleteQueueAsync();

                var enqueueTask = Run.InParallelAsync(workItemCount, index => queue.EnqueueAsync(new SampleQueueWorkItem {
                    Created = SystemClock.UtcNow,
                    Path    = "somepath" + index
                }));

                var lockProvider = new ThrottlingLockProvider(new InMemoryCacheClient(new InMemoryCacheClientOptions()), allowedLockCount, TimeSpan.FromDays(1), Log);
                var job          = new SampleQueueJobWithLocking(queue, null, lockProvider, Log);
                await SystemClock.SleepAsync(10);

                await Task.WhenAll(job.RunUntilEmptyAsync(), enqueueTask);

                var stats = await queue.GetQueueStatsAsync();

                Assert.Equal(0, stats.Queued);
                Assert.Equal(workItemCount, stats.Enqueued);
                Assert.Equal(allowedLockCount, stats.Completed);
                Assert.Equal(allowedLockCount * 4, stats.Abandoned);
                Assert.Equal(allowedLockCount, stats.Deadletter);
            }
        }
Exemplo n.º 2
0
        public virtual async Task CanRunQueueJobWithLockFail()
        {
            const int workItemCount    = 10;
            const int allowedLockCount = 5;
            var       queue            = GetSampleWorkItemQueue(retries: 3, retryDelay: TimeSpan.Zero);
            await queue.DeleteQueueAsync();

            Log.MinimumLevel = LogLevel.Trace;

            var enqueueTask = Run.InParallel(workItemCount, async index => {
                await queue.EnqueueAsync(new SampleQueueWorkItem {
                    Created = DateTime.Now,
                    Path    = "somepath" + index
                });
            });

            var lockProvider = new ThrottlingLockProvider(new InMemoryCacheClient(), allowedLockCount, TimeSpan.FromDays(1), Log);
            var job          = new SampleQueueJobWithLocking(queue, null, lockProvider, Log);
            await Task.Delay(10);

            await Task.WhenAll(job.RunUntilEmptyAsync(), enqueueTask);

            var stats = await queue.GetQueueStatsAsync();

            Assert.Equal(0, stats.Queued);
            Assert.Equal(workItemCount, stats.Enqueued);
            Assert.Equal(allowedLockCount, stats.Completed);
            Assert.Equal(allowedLockCount * 4, stats.Abandoned);
            Assert.Equal(allowedLockCount, stats.Deadletter);
        }
Exemplo n.º 3
0
            public ScheduledJobRunner(Func <IJob> jobFactory, string schedule, ICacheClient cacheClient, ILoggerFactory loggerFactory = null)
            {
                _jobFactory = jobFactory;
                Schedule    = schedule;
                _logger     = loggerFactory?.CreateLogger <ScheduledJobRunner>() ?? NullLogger <ScheduledJobRunner> .Instance;

                _cronSchedule = CronExpression.Parse(schedule);
                if (_cronSchedule == null)
                {
                    throw new ArgumentException("Could not parse schedule.", nameof(schedule));
                }

                var interval = TimeSpan.FromDays(1);

                var nextOccurrence = _cronSchedule.GetNextOccurrence(SystemClock.UtcNow);

                if (nextOccurrence.HasValue)
                {
                    var nextNextOccurrence = _cronSchedule.GetNextOccurrence(nextOccurrence.Value);
                    if (nextNextOccurrence.HasValue)
                    {
                        interval = nextNextOccurrence.Value.Subtract(nextOccurrence.Value);
                    }
                }

                _lockProvider = new ThrottlingLockProvider(cacheClient, 1, interval.Add(interval));

                NextRun = _cronSchedule.GetNextOccurrence(SystemClock.UtcNow);
            }
Exemplo n.º 4
0
 public ThrottledJob(ICacheClient client)
 {
     _locker = new ThrottlingLockProvider(client, 1, TimeSpan.FromMilliseconds(100));
 }
Exemplo n.º 5
0
 public ThrottledJob(ICacheClient client, ILoggerFactory loggerFactory = null) : base(loggerFactory)
 {
     _locker = new ThrottlingLockProvider(client, 1, TimeSpan.FromMilliseconds(100), loggerFactory);
 }
 public ElasticSearchConfiguration(ICacheClient cacheClient, IQueue <WorkItemData> workItemQueue)
 {
     _lockProvider  = new ThrottlingLockProvider(cacheClient, 1, TimeSpan.FromMinutes(1));
     _workItemQueue = workItemQueue;
 }