diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs index a320263f4b..09554c9268 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs @@ -79,7 +79,7 @@ namespace Volo.Abp.BackgroundJobs public async Task DeleteAsync(Guid jobId) { - var jobInfo = await Store.GetAsync(jobId); + var jobInfo = await Store.FindAsync(jobId); if (jobInfo == null) { return false; diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobStore.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobStore.cs index 1c18d2a273..d1fd307c7a 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobStore.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobStore.cs @@ -14,7 +14,7 @@ namespace Volo.Abp.BackgroundJobs /// /// The Job Unique Identifier. /// The BackgroundJobInfo object. - Task GetAsync(Guid jobId); + Task FindAsync(Guid jobId); /// /// Inserts a background job. diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs new file mode 100644 index 0000000000..2b9d8700dc --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Timing; + +namespace Volo.Abp.BackgroundJobs +{ + public class InMemoryBackgroundJobStore : IBackgroundJobStore, ISingletonDependency + { + private readonly ConcurrentDictionary _jobs; + + protected IClock Clock { get; } + + /// + /// Initializes a new instance of the class. + /// + public InMemoryBackgroundJobStore(IClock clock) + { + Clock = clock; + _jobs = new ConcurrentDictionary(); + } + + public Task FindAsync(Guid jobId) + { + return Task.FromResult(_jobs[jobId]); + } + + public Task InsertAsync(BackgroundJobInfo jobInfo) + { + _jobs[jobInfo.Id] = jobInfo; + + return Task.FromResult(0); + } + + public Task> GetWaitingJobsAsync(int maxResultCount) + { + var waitingJobs = _jobs.Values + .Where(t => !t.IsAbandoned && t.NextTryTime <= Clock.Now) + .OrderByDescending(t => t.Priority) + .ThenBy(t => t.TryCount) + .ThenBy(t => t.NextTryTime) + .Take(maxResultCount) + .ToList(); + + return Task.FromResult(waitingJobs); + } + + public Task DeleteAsync(BackgroundJobInfo jobInfo) + { + _jobs.TryRemove(jobInfo.Id, out _); + + return Task.FromResult(0); + } + + public Task UpdateAsync(BackgroundJobInfo jobInfo) + { + if (jobInfo.IsAbandoned) + { + return DeleteAsync(jobInfo); + } + + return Task.FromResult(0); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/NullBackgroundJobStore.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/NullBackgroundJobStore.cs deleted file mode 100644 index 42a6656567..0000000000 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/NullBackgroundJobStore.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace Volo.Abp.BackgroundJobs -{ - /// - /// Null pattern implementation of . - /// It's used if is not implemented by actual persistent store - /// and job execution is not enabled () for the application. - /// - public class NullBackgroundJobStore : IBackgroundJobStore - { - public Task GetAsync(Guid jobId) - { - return Task.FromResult((BackgroundJobInfo)null); - } - - public Task InsertAsync(BackgroundJobInfo jobInfo) - { - return Task.CompletedTask; - } - - public Task> GetWaitingJobsAsync(int maxResultCount) - { - return Task.FromResult(new List()); - } - - public Task DeleteAsync(BackgroundJobInfo jobInfo) - { - return Task.CompletedTask; - } - - public Task UpdateAsync(BackgroundJobInfo jobInfo) - { - return Task.CompletedTask; - } - } -} \ No newline at end of file