| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |  | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | using System; | 
					
						
							|  |  |  |  | using System.Collections.Generic; | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  | using System.Collections.ObjectModel; | 
					
						
							|  |  |  |  | using System.Threading.Tasks; | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | using Quartz; | 
					
						
							|  |  |  |  | using Quartz.Impl; | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | namespace BLL | 
					
						
							|  |  |  |  | { | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |     public class QuartzServices | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static async Task Init() | 
					
						
							|  |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             //初始化计划者 | 
					
						
							|  |  |  |  |             StdSchedulerFactory factory = new StdSchedulerFactory(); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |             // StdSchedulerFactory factory = new StdSchedulerFactory(properties); | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |             IScheduler scheduler = await factory.GetScheduler(); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |             var jobAndTriggerMapping = new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>(); | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |             // 将映射关系包装成制度字典集合   | 
					
						
							|  |  |  |  |             var model = new Model.InterFaceTask(); | 
					
						
							|  |  |  |  |             model.Enable = true; | 
					
						
							|  |  |  |  |             var list = InterFaceTaskService.GetInterFaceTaskByModle(model); | 
					
						
							|  |  |  |  |             foreach (var item in list) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 var jobDetail1 = GetJobDetailByInterFaceTaskId(item.InterFaceTaskId); | 
					
						
							|  |  |  |  |                 var trigger1 = GetTriggerByTime(item.InterFaceTaskId, item.Frequency); | 
					
						
							|  |  |  |  |                 //给计划者添加Job和触发器 | 
					
						
							|  |  |  |  |                 jobAndTriggerMapping[jobDetail1] = trigger1; | 
					
						
							|  |  |  |  |                 //keyValuePairs.Add(item.InterFaceTaskId, scheduler); | 
					
						
							|  |  |  |  |                 //Funs.ScheduledTasks = keyValuePairs; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             var readOnlyjobAndTriggerMapping = new ReadOnlyDictionary<IJobDetail, IReadOnlyCollection<ITrigger>>(jobAndTriggerMapping); | 
					
						
							|  |  |  |  |             await scheduler.ScheduleJobs(readOnlyjobAndTriggerMapping, true); | 
					
						
							|  |  |  |  |             await scheduler.Start(); //只有启动了,里面的任务才会定时触发 | 
					
						
							|  |  |  |  |             Funs.ScheduledTasks = scheduler; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |         public static void ISchedulerShupDown(IScheduler scheduler) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             scheduler.Shutdown(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 同步任务调度 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="InterFaceTaskId"></param> | 
					
						
							|  |  |  |  |         /// <returns></returns> | 
					
						
							|  |  |  |  |         public static async Task SyncISchedulerById(string InterFaceTaskId) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             try | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 StdSchedulerFactory factory = new StdSchedulerFactory(); | 
					
						
							|  |  |  |  |                 var model = InterFaceTaskService.GetInterFaceTaskById(InterFaceTaskId); | 
					
						
							|  |  |  |  |                 // var item = Funs.ScheduledTasks.Where(x => x.Key == InterFaceTaskId).FirstOrDefault(); | 
					
						
							|  |  |  |  |                 IScheduler scheduler = Funs.ScheduledTasks; | 
					
						
							|  |  |  |  |                 JobKey jk = new JobKey(InterFaceTaskId, "group1"); | 
					
						
							|  |  |  |  |                 if (model != null) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     if (model.Enable == true) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         if (scheduler.GetJobDetail(jk, default) != null) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             var jobDetail1 = GetJobDetailByInterFaceTaskId(model.InterFaceTaskId); | 
					
						
							|  |  |  |  |                             var trigger1 = GetTriggerByTime(model.InterFaceTaskId, model.Frequency); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                             await scheduler.ScheduleJob(jobDetail1, trigger1, true); | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         else | 
					
						
							|  |  |  |  |                         { | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |                             var jobDetail1 = GetJobDetailByInterFaceTaskId(model.InterFaceTaskId); | 
					
						
							|  |  |  |  |                             var trigger1 = GetTriggerByTime(model.InterFaceTaskId, model.Frequency); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                             await scheduler.ScheduleJob(jobDetail1, trigger1, true); | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |                         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     else | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         if (scheduler.GetJobDetail(jk, default) != null) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             await scheduler.DeleteJob(jk, default); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |                             //  SyncScheduledTasks(model.InterFaceTaskId, scheduler, 2); | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |                         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 Funs.ScheduledTasks = scheduler; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             catch (Exception ex) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 string a = ex.ToString(); | 
					
						
							|  |  |  |  |                 throw; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 同步任务列表 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="InterFaceTaskId"></param> | 
					
						
							|  |  |  |  |         /// <param name="scheduler"></param> | 
					
						
							|  |  |  |  |         /// <param name="type">0 增 1 修改 2删除</param> | 
					
						
							|  |  |  |  |         public static void SyncScheduledTasks(string InterFaceTaskId, IScheduler scheduler, int type) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (type == 0) | 
					
						
							|  |  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                 //  Funs.ScheduledTasks.Add(InterFaceTaskId, scheduler); | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |             } | 
					
						
							|  |  |  |  |             else if (type == 1) | 
					
						
							|  |  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                 //   Funs.ScheduledTasks.Remove(InterFaceTaskId); | 
					
						
							|  |  |  |  |                 // Funs.ScheduledTasks.Add(InterFaceTaskId, scheduler); | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |             } | 
					
						
							|  |  |  |  |             else if (type == 2) | 
					
						
							|  |  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                 // Funs.ScheduledTasks.Remove(InterFaceTaskId); | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         public static IJobDetail GetJobDetailByInterFaceTaskId(string InterFaceTaskId) | 
					
						
							|  |  |  |  |         { //创建Job | 
					
						
							|  |  |  |  |             IJobDetail jobDetail1 = JobBuilder.Create<MyJob>() | 
					
						
							|  |  |  |  |                  .WithIdentity(InterFaceTaskId, "group1")//给Job身份 | 
					
						
							|  |  |  |  |                  .WithDescription("任务的描述,方便查找") | 
					
						
							|  |  |  |  |                  .UsingJobData("InterFaceTaskId", InterFaceTaskId) | 
					
						
							|  |  |  |  |                  .Build(); | 
					
						
							|  |  |  |  |             return jobDetail1; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         public static ReadOnlyCollection<ITrigger> GetTriggerByTime(string InterFaceTaskId, string time) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             string cron = "0 0 0/& * * ? "; | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |             // cron = cron.Replace("&", time); | 
					
						
							|  |  |  |  |             cron = time; | 
					
						
							|  |  |  |  |             //  cron = "0 0/1 * * * ? "; | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  |             //创建触发器 | 
					
						
							|  |  |  |  |             var trigger1 = new ReadOnlyCollection<ITrigger>( | 
					
						
							|  |  |  |  |                 new List<ITrigger>() | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 TriggerBuilder.Create() | 
					
						
							|  |  |  |  |                 .WithIdentity(InterFaceTaskId, "group1") //给触发器身份 | 
					
						
							|  |  |  |  |                 .WithDescription("触发器的描述,方便查找") | 
					
						
							|  |  |  |  |                 .StartAt(new DateTimeOffset(DateTime.Now.AddSeconds(10))) //.StartNow()都是启动触发器方式 | 
					
						
							|  |  |  |  |                 .WithCronSchedule(cron) //定时策略,Cron表达式 | 
					
						
							|  |  |  |  |                 .Build() | 
					
						
							|  |  |  |  |         }); | 
					
						
							|  |  |  |  |             return trigger1; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-08-10 11:40:02 +08:00
										 |  |  |  | 
 |