[Abp 源码分析]十六、后台作业与后台工作者 (5)

这里先从简单的内存 Store 说起,这个 InMemoryBackgroundJobStore 内部使用了一个并行字典来存储这些任务信息。

public class InMemoryBackgroundJobStore : IBackgroundJobStore { private readonly ConcurrentDictionary<long, BackgroundJobInfo> _jobs; private long _lastId; public InMemoryBackgroundJobStore() { _jobs = new ConcurrentDictionary<long, BackgroundJobInfo>(); } }

相当简单,这几个接口方法基本上就是针对与这个并行字典操作的一层封装。

public Task<BackgroundJobInfo> GetAsync(long jobId) { return Task.FromResult(_jobs[jobId]); } public Task InsertAsync(BackgroundJobInfo jobInfo) { jobInfo.Id = Interlocked.Increment(ref _lastId); _jobs[jobInfo.Id] = jobInfo; return Task.FromResult(0); } public Task<List<BackgroundJobInfo>> 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); }

至于持久化到数据库,无非是注入一个仓储,然后针对这个仓储进行增删查改的操作罢了,这里就不在赘述。

2.2.3 后台作业优先级

后台作业的优先级定义在 BackgroundJobPriority 枚举当中,一共有 5 个等级,分别是 Low、BelowNormal、Normal、AboveNormal、High ,他们从最低到最高排列。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssddj.html