DbJobPersistence.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. if (context.Behavior == PersistenceBehavior.Appended)
  67. {
  68. _jobRepository.AsInsertable(jobDetail).ExecuteCommand();
  69. }
  70. else if (context.Behavior == PersistenceBehavior.Updated)
  71. {
  72. _jobRepository.AsUpdateable(jobDetail).WhereColumns(u => new { u.JobId }).IgnoreColumns(u => new { u.Id }).ExecuteCommand();
  73. }
  74. else if (context.Behavior == PersistenceBehavior.Removed)
  75. {
  76. _jobRepository.AsDeleteable().Where(u => u.JobId == jobDetail.JobId).ExecuteCommand();
  77. }
  78. }
  79. /// <summary>
  80. /// 作业计划Scheduler的触发器Trigger变化时
  81. /// </summary>
  82. /// <param name="context"></param>
  83. public void OnTriggerChanged(PersistenceTriggerContext context)
  84. {
  85. using var scope = _serviceScopeFactory.CreateScope();
  86. var _triggerRepository = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysJobTrigger>>();
  87. var jobTrigger = context.Trigger.Adapt<SysJobTrigger>();
  88. if (context.Behavior == PersistenceBehavior.Appended)
  89. {
  90. _triggerRepository.AsInsertable(jobTrigger).ExecuteCommand();
  91. }
  92. else if (context.Behavior == PersistenceBehavior.Updated)
  93. {
  94. _triggerRepository.AsUpdateable(jobTrigger).WhereColumns(u => new { u.TriggerId, u.JobId }).IgnoreColumns(u => new { u.Id }).ExecuteCommand();
  95. }
  96. else if (context.Behavior == PersistenceBehavior.Removed)
  97. {
  98. _triggerRepository.AsDeleteable().Where(u => u.TriggerId == jobTrigger.TriggerId && u.JobId == jobTrigger.JobId).ExecuteCommand();
  99. }
  100. }
  101. }