Просмотр исходного кода

任务调度持久化调整(待优化)

zuohuaijun 3 лет назад
Родитель
Сommit
9ac822b5ee
1 измененных файлов с 48 добавлено и 3 удалено
  1. 48 3
      Admin.NET/Admin.NET.Core/Service/Job/DbJobPersistence.cs

+ 48 - 3
Admin.NET/Admin.NET.Core/Service/Job/DbJobPersistence.cs

@@ -18,8 +18,53 @@ public class DbJobPersistence : IJobPersistence
     /// <returns></returns>
     public IEnumerable<SchedulerBuilder> Preload()
     {
-        // 扫描所有实现IJob的作业任务
-        return App.EffectiveTypes.ScanToBuilders();
+        using var serviceScope = _serviceProvider.CreateScope();
+        var jobDetailRep = serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysJobDetail>>();
+        var jobTriggerRep = serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysJobTrigger>>();
+
+        // 获取内存的作业
+        IEnumerable<SchedulerBuilder> memoryJobs = App.EffectiveTypes.ScanToBuilders();
+
+        // 若数据库不存在任何作业,则返回内存作业
+        if (!jobDetailRep.IsAny(u => true)) return memoryJobs;
+
+        var schedulerBuilders = new List<SchedulerBuilder>();
+
+        // 获取数据库所有作业
+        var dbJobs = jobDetailRep.GetList();
+        foreach (var dbJob in dbJobs)
+        {
+            var jobDetail = JobBuilder.Create(dbJob.AssemblyName, dbJob.JobType).LoadFrom(dbJob);
+
+            // 加载数据库的触发器
+            var triggerBuilders = new List<TriggerBuilder>();            
+            var dbTriggers = jobTriggerRep.GetList(u => u.JobId == dbJob.JobId)
+                .Select(u => Triggers.Create(u.AssemblyName, u.TriggerType).LoadFrom(u)).ToArray();
+            triggerBuilders.AddRange(dbTriggers);
+
+            var memoryTriggers = memoryJobs.Where(u => u.GetJobBuilder().JobId == dbJob.JobId).SelectMany(u => u.GetTriggerBuilders());
+            foreach (var memTrigger in memoryTriggers)
+            {
+                var triggerId = memTrigger.TriggerId;
+                // 若数据库中已包含这个触发器
+                if (!string.IsNullOrWhiteSpace(triggerId) && dbTriggers.Any(u => u.TriggerId == triggerId)) 
+                    continue;
+                triggerBuilders.Add(memTrigger);
+            }
+            schedulerBuilders.Add(SchedulerBuilder.Create(jobDetail, triggerBuilders.ToArray()).Updated());
+        }
+
+        // 合并作业
+        foreach (var job in memoryJobs)
+        {
+            var jobId = job.GetJobBuilder().JobId;
+            // 若数据库中已包含这个作业
+            if (!string.IsNullOrWhiteSpace(jobId) && dbJobs.Any(u => u.JobId == jobId)) 
+                continue;
+            schedulerBuilders.Add(job);
+        }
+
+        return schedulerBuilders;
     }
 
     /// <summary>
@@ -41,7 +86,7 @@ public class DbJobPersistence : IJobPersistence
             return builder.Updated();
         }
 
-        return builder.Appended();
+        return builder;
     }
 
     /// <summary>