namespace Admin.NET.Core.Service;
///
/// 作业持久化(数据库)
///
public class DbJobPersistence : IJobPersistence
{
private readonly IServiceProvider _serviceProvider;
public DbJobPersistence(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
///
/// 作业调度服务启动时
///
///
public IEnumerable Preload()
{
using var serviceScope = _serviceProvider.CreateScope();
var jobDetailRep = serviceScope.ServiceProvider.GetService>();
var jobTriggerRep = serviceScope.ServiceProvider.GetService>();
// 获取内存的作业
IEnumerable memoryJobs = App.EffectiveTypes.ScanToBuilders();
// 若数据库不存在任何作业,则返回内存作业
if (!jobDetailRep.IsAny(u => true)) return memoryJobs;
var schedulerBuilders = new List();
// 获取数据库所有作业
var dbJobs = jobDetailRep.GetList();
foreach (var dbJob in dbJobs)
{
var jobDetail = JobBuilder.Create(dbJob.AssemblyName, dbJob.JobType).LoadFrom(dbJob);
// 加载数据库的触发器
var triggerBuilders = new List();
var dbTriggers = jobTriggerRep.GetList(u => u.JobId == dbJob.JobId)
.Select(u => Triggers.Create(u.AssemblyName, u.TriggerType).LoadFrom(u)).ToArray();
triggerBuilders.AddRange(dbTriggers);
var memoryTriggers = memoryJobs.Where(u => u.GetJobBuilder().JobId == dbJob.JobId).SelectMany(u => u.GetTriggerBuilders());
foreach (var memTrigger in memoryTriggers)
{
var triggerId = memTrigger.TriggerId;
// 若数据库中已包含这个触发器
if (!string.IsNullOrWhiteSpace(triggerId) && dbTriggers.Any(u => u.TriggerId == triggerId))
continue;
triggerBuilders.Add(memTrigger);
}
schedulerBuilders.Add(SchedulerBuilder.Create(jobDetail, triggerBuilders.ToArray()).Updated());
}
// 合并作业
foreach (var job in memoryJobs)
{
var jobId = job.GetJobBuilder().JobId;
// 若数据库中已包含这个作业
if (!string.IsNullOrWhiteSpace(jobId) && dbJobs.Any(u => u.JobId == jobId))
continue;
schedulerBuilders.Add(job);
}
return schedulerBuilders;
}
///
/// 作业计划初始化通知
///
///
///
public SchedulerBuilder OnLoading(SchedulerBuilder builder)
{
return builder;
}
///
/// 作业计划Scheduler的JobDetail变化时
///
///
public void OnChanged(PersistenceContext context)
{
using var serviceScope = _serviceProvider.CreateScope();
var db = serviceScope.ServiceProvider.GetService();
var jobDetail = context.JobDetail.Adapt();
if (context.Behavior == PersistenceBehavior.Appended)
{
db.Insertable(jobDetail).ExecuteCommand();
}
else if (context.Behavior == PersistenceBehavior.Updated)
{
db.Updateable(jobDetail).WhereColumns(u => new { u.JobId }).IgnoreColumns(u => new { u.Id }).ExecuteCommand();
}
else if (context.Behavior == PersistenceBehavior.Removed)
{
db.Deleteable().Where(u => u.JobId == jobDetail.JobId).ExecuteCommand();
}
}
///
/// 作业计划Scheduler的触发器Trigger变化时
///
///
public void OnTriggerChanged(PersistenceTriggerContext context)
{
using var serviceScope = _serviceProvider.CreateScope();
var db = serviceScope.ServiceProvider.GetService();
var jobTrigger = context.Trigger.Adapt();
if (context.Behavior == PersistenceBehavior.Appended)
{
db.Insertable(jobTrigger).ExecuteCommand();
}
else if (context.Behavior == PersistenceBehavior.Updated)
{
db.Updateable(jobTrigger).WhereColumns(u => new { u.TriggerId, u.JobId }).IgnoreColumns(u => new { u.Id }).ExecuteCommand();
}
else if (context.Behavior == PersistenceBehavior.Removed)
{
db.Deleteable().Where(u => u.TriggerId == jobTrigger.TriggerId && u.JobId == jobTrigger.JobId).ExecuteCommand();
}
}
}