DbJobPersistence.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. // 扫描所有实现IJob的作业任务
  19. return App.EffectiveTypes.Where(t => t.IsJobType())
  20. .Select(t => SchedulerBuilder.Create(JobBuilder.Create(t), t.ScanTriggers()));
  21. }
  22. /// <summary>
  23. /// 作业计划加载完成(通常用来同步存储介质(如数据库)数据到内存中)
  24. /// </summary>
  25. /// <param name="jobId"></param>
  26. /// <param name="builder"></param>
  27. /// <returns></returns>
  28. public SchedulerBuilder OnLoaded(string jobId, SchedulerBuilder builder)
  29. {
  30. using var serviceScope = _serviceProvider.CreateScope();
  31. var rep = serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysJobDetail>>();
  32. //if (builder.Behavior == PersistenceBehavior.Removed)
  33. //{
  34. // rep.Delete(u => u.JobId == jobId);
  35. // return builder.Removed();
  36. //}
  37. if (rep.IsAny(u => u.JobId == jobId))
  38. {
  39. return builder.Updated();
  40. }
  41. else
  42. {
  43. return builder.Appended();
  44. }
  45. }
  46. /// <summary>
  47. /// 作业计划Scheduler的JobDetail变化时
  48. /// </summary>
  49. /// <param name="context"></param>
  50. public void OnChanged(PersistenceContext context)
  51. {
  52. using var serviceScope = _serviceProvider.CreateScope();
  53. var db = serviceScope.ServiceProvider.GetService<ISqlSugarClient>();
  54. var sql = context.ConvertToSQL(db.EntityMaintenance.GetEntityInfo<SysJobDetail>().DbTableName, NamingConventions.Pascal);
  55. db.Ado.ExecuteCommand(sql);
  56. }
  57. /// <summary>
  58. /// 作业计划Scheduler的触发器Trigger变化时
  59. /// </summary>
  60. /// <param name="context"></param>
  61. public void OnTriggerChanged(PersistenceTriggerContext context)
  62. {
  63. using var serviceScope = _serviceProvider.CreateScope();
  64. var db = serviceScope.ServiceProvider.GetService<ISqlSugarClient>();
  65. var sql = context.ConvertToSQL(db.EntityMaintenance.GetEntityInfo<SysJobTrigger>().DbTableName, NamingConventions.Pascal);
  66. db.Ado.ExecuteCommand(sql);
  67. }
  68. }