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); } }
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); }
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); }
public ThrottledJob(ICacheClient client) { _locker = new ThrottlingLockProvider(client, 1, TimeSpan.FromMilliseconds(100)); }
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; }