DbJobPersistence.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 作业持久化(数据库)
  4. /// </summary>
  5. public class DbJobPersistence : IJobPersistence
  6. {
  7. private readonly IServiceProvider _serviceProvider;
  8. public DbJobPersistence(IServiceProvider serviceProvider)
  9. {
  10. _serviceProvider = serviceProvider;
  11. }
  12. /// <summary>
  13. /// 作业调度服务启动时
  14. /// </summary>
  15. /// <returns></returns>
  16. public IEnumerable<SchedulerBuilder> Preload()
  17. {
  18. using var serviceScope = _serviceProvider.CreateScope();
  19. var jobDetailRep = serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysJobDetail>>();
  20. var jobTriggerRep = serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysJobTrigger>>();
  21. // 获取内存的作业
  22. IEnumerable<SchedulerBuilder> memoryJobs = App.EffectiveTypes.ScanToBuilders();
  23. // 若数据库不存在任何作业,则返回内存作业
  24. if (!jobDetailRep.IsAny(u => true)) return memoryJobs;
  25. var schedulerBuilders = new List<SchedulerBuilder>();
  26. // 获取数据库所有作业
  27. var dbJobs = jobDetailRep.GetList();
  28. foreach (var dbJob in dbJobs)
  29. {
  30. var jobDetail = JobBuilder.Create(dbJob.AssemblyName, dbJob.JobType).LoadFrom(dbJob);
  31. // 加载数据库的触发器
  32. var triggerBuilders = new List<TriggerBuilder>();
  33. var dbTriggers = jobTriggerRep.GetList(u => u.JobId == dbJob.JobId)
  34. .Select(u => Triggers.Create(u.AssemblyName, u.TriggerType).LoadFrom(u)).ToArray();
  35. triggerBuilders.AddRange(dbTriggers);
  36. var memoryTriggers = memoryJobs.Where(u => u.GetJobBuilder().JobId == dbJob.JobId).SelectMany(u => u.GetTriggerBuilders());
  37. foreach (var memTrigger in memoryTriggers)
  38. {
  39. var triggerId = memTrigger.TriggerId;
  40. // 若数据库中已包含这个触发器
  41. if (!string.IsNullOrWhiteSpace(triggerId) && dbTriggers.Any(u => u.TriggerId == triggerId))
  42. continue;
  43. triggerBuilders.Add(memTrigger);
  44. }
  45. schedulerBuilders.Add(SchedulerBuilder.Create(jobDetail, triggerBuilders.ToArray()).Updated());
  46. }
  47. // 合并作业
  48. foreach (var job in memoryJobs)
  49. {
  50. var jobId = job.GetJobBuilder().JobId;
  51. // 若数据库中已包含这个作业
  52. if (!string.IsNullOrWhiteSpace(jobId) && dbJobs.Any(u => u.JobId == jobId))
  53. continue;
  54. schedulerBuilders.Add(job);
  55. }
  56. return schedulerBuilders;
  57. }
  58. /// <summary>
  59. /// 作业计划初始化通知
  60. /// </summary>
  61. /// <param name="builder"></param>
  62. /// <returns></returns>
  63. public SchedulerBuilder OnLoading(SchedulerBuilder builder)
  64. {
  65. return builder;
  66. }
  67. /// <summary>
  68. /// 作业计划Scheduler的JobDetail变化时
  69. /// </summary>
  70. /// <param name="context"></param>
  71. public void OnChanged(PersistenceContext context)
  72. {
  73. using var serviceScope = _serviceProvider.CreateScope();
  74. var db = serviceScope.ServiceProvider.GetService<ISqlSugarClient>();
  75. var jobDetail = context.JobDetail.Adapt<SysJobDetail>();
  76. if (context.Behavior == PersistenceBehavior.Appended)
  77. {
  78. db.Insertable(jobDetail).ExecuteCommand();
  79. }
  80. else if (context.Behavior == PersistenceBehavior.Updated)
  81. {
  82. db.Updateable(jobDetail).WhereColumns(u => new { u.JobId }).ExecuteCommand();
  83. }
  84. else if (context.Behavior == PersistenceBehavior.Removed)
  85. {
  86. db.Deleteable<SysJobDetail>().Where(u => u.JobId == jobDetail.JobId).ExecuteCommand();
  87. }
  88. }
  89. /// <summary>
  90. /// 作业计划Scheduler的触发器Trigger变化时
  91. /// </summary>
  92. /// <param name="context"></param>
  93. public void OnTriggerChanged(PersistenceTriggerContext context)
  94. {
  95. using var serviceScope = _serviceProvider.CreateScope();
  96. var db = serviceScope.ServiceProvider.GetService<ISqlSugarClient>();
  97. var jobTrigger = context.Trigger.Adapt<SysJobTrigger>();
  98. if (context.Behavior == PersistenceBehavior.Appended)
  99. {
  100. db.Insertable(jobTrigger).ExecuteCommand();
  101. }
  102. else if (context.Behavior == PersistenceBehavior.Updated)
  103. {
  104. db.Updateable(jobTrigger).WhereColumns(u => new { u.TriggerId, u.JobId }).ExecuteCommand();
  105. }
  106. else if (context.Behavior == PersistenceBehavior.Removed)
  107. {
  108. db.Deleteable<SysJobTrigger>().Where(u => u.TriggerId == jobTrigger.TriggerId && u.JobId == jobTrigger.JobId).ExecuteCommand();
  109. }
  110. }
  111. }