DbJobPersistence.cs 5.0 KB

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