DbJobPersistence.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 作业持久化(数据库)
  4. /// </summary>
  5. public class DbJobPersistence : IJobPersistence
  6. {
  7. private readonly IServiceScopeFactory _serviceScopeFactory;
  8. public DbJobPersistence(IServiceScopeFactory serviceScopeFactory)
  9. {
  10. _serviceScopeFactory = serviceScopeFactory;
  11. }
  12. /// <summary>
  13. /// 作业调度服务启动时
  14. /// </summary>
  15. /// <returns></returns>
  16. public IEnumerable<SchedulerBuilder> Preload()
  17. {
  18. using var scope = _serviceScopeFactory.CreateScope();
  19. var jobRepository = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysJobDetail>>();
  20. var triggerRepository = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysJobTrigger>>();
  21. // 获取所有定义的作业
  22. var allJobs = App.EffectiveTypes.ScanToBuilders();
  23. // 若数据库不存在任何作业,则直接返回
  24. if (!jobRepository.IsAny(u => true)) return allJobs;
  25. // 遍历所有定义的作业
  26. foreach (var schedulerBuilder in allJobs)
  27. {
  28. // 获取作业信息构建器
  29. var jobBuilder = schedulerBuilder.GetJobBuilder();
  30. // 加载数据库数据
  31. var dbDetail = jobRepository.GetFirst(u => u.JobId == jobBuilder.JobId);
  32. if (dbDetail == null) continue;
  33. // 同步数据库数据
  34. jobBuilder.LoadFrom(dbDetail);
  35. // 遍历所有作业触发器
  36. foreach (var (_, triggerBuilder) in schedulerBuilder.GetEnumerable())
  37. {
  38. // 加载数据库数据
  39. var dbTrigger = triggerRepository.GetFirst(u => u.JobId == jobBuilder.JobId && u.TriggerId == triggerBuilder.TriggerId);
  40. if (dbTrigger == null) continue;
  41. triggerBuilder.LoadFrom(dbTrigger).Updated(); // 标记更新
  42. }
  43. // 标记更新
  44. schedulerBuilder.Updated();
  45. }
  46. return allJobs;
  47. }
  48. /// <summary>
  49. /// 作业计划初始化通知
  50. /// </summary>
  51. /// <param name="builder"></param>
  52. /// <returns></returns>
  53. public SchedulerBuilder OnLoading(SchedulerBuilder builder)
  54. {
  55. return builder;
  56. }
  57. /// <summary>
  58. /// 作业计划Scheduler的JobDetail变化时
  59. /// </summary>
  60. /// <param name="context"></param>
  61. public void OnChanged(PersistenceContext context)
  62. {
  63. using var scope = _serviceScopeFactory.CreateScope();
  64. var jobRepository = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysJobDetail>>();
  65. var jobDetail = context.JobDetail.Adapt<SysJobDetail>();
  66. switch (context.Behavior)
  67. {
  68. case PersistenceBehavior.Appended:
  69. jobRepository.AsInsertable(jobDetail).ExecuteCommand();
  70. break;
  71. case PersistenceBehavior.Updated:
  72. jobRepository.AsUpdateable(jobDetail).WhereColumns(u => new { u.JobId }).IgnoreColumns(u => new { u.Id }).ExecuteCommand();
  73. break;
  74. case PersistenceBehavior.Removed:
  75. jobRepository.AsDeleteable().Where(u => u.JobId == jobDetail.JobId).ExecuteCommand();
  76. break;
  77. default:
  78. throw new ArgumentOutOfRangeException();
  79. }
  80. }
  81. /// <summary>
  82. /// 作业计划Scheduler的触发器Trigger变化时
  83. /// </summary>
  84. /// <param name="context"></param>
  85. public void OnTriggerChanged(PersistenceTriggerContext context)
  86. {
  87. using var scope = _serviceScopeFactory.CreateScope();
  88. var triggerRepository = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysJobTrigger>>();
  89. var jobTrigger = context.Trigger.Adapt<SysJobTrigger>();
  90. switch (context.Behavior)
  91. {
  92. case PersistenceBehavior.Appended:
  93. triggerRepository.AsInsertable(jobTrigger).ExecuteCommand();
  94. break;
  95. case PersistenceBehavior.Updated:
  96. triggerRepository.AsUpdateable(jobTrigger).WhereColumns(u => new { u.TriggerId, u.JobId }).IgnoreColumns(u => new { u.Id }).ExecuteCommand();
  97. break;
  98. case PersistenceBehavior.Removed:
  99. triggerRepository.AsDeleteable().Where(u => u.TriggerId == jobTrigger.TriggerId && u.JobId == jobTrigger.JobId).ExecuteCommand();
  100. break;
  101. default:
  102. throw new ArgumentOutOfRangeException();
  103. }
  104. }
  105. }