From 9838c6310792e4051fd231ac75a9e0a93c7a6b8c Mon Sep 17 00:00:00 2001 From: xiaju <1784803958@qq.com> Date: Thu, 11 Dec 2025 10:37:45 +0800 Subject: [PATCH] 1 --- .../TaskScheduling/TimerTask/TimerTaskBase.cs | 151 +++++++++++++----- 1 file changed, 112 insertions(+), 39 deletions(-) diff --git a/SGGL/BLL/TaskScheduling/TimerTask/TimerTaskBase.cs b/SGGL/BLL/TaskScheduling/TimerTask/TimerTaskBase.cs index baff7d7..45c0d89 100644 --- a/SGGL/BLL/TaskScheduling/TimerTask/TimerTaskBase.cs +++ b/SGGL/BLL/TaskScheduling/TimerTask/TimerTaskBase.cs @@ -2,7 +2,14 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.Drawing.Printing; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; using System.Threading.Tasks; +using FineUIPro; using Quartz; using Quartz.Impl; @@ -13,39 +20,53 @@ namespace BLL public static async Task Init() { - + ErrLogInfo.WriteLog("定时任务Init!"); //初始化计划者 StdSchedulerFactory factory = new StdSchedulerFactory(); - // StdSchedulerFactory factory = new StdSchedulerFactory(properties); IScheduler scheduler = await factory.GetScheduler(); var jobAndTriggerMapping = new Dictionary>(); // 将映射关系包装成制度字典集合 var model = new Model.InterFaceTask(); model.Enable = true; var list = InterFaceTaskService.GetInterFaceTaskByModle(model); + if (list == null || list.Count == 0) + { + ErrLogInfo.WriteLog("未找到任何启用的定时任务"); + return; + } 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; + try + { + var jobDetail1 = GetJobDetailByInterFaceTaskId(item.InterFaceTaskId); + if (!CronExpression.IsValidExpression(item.Frequency)) + { + ErrLogInfo.WriteLog($"任务ID {item.InterFaceTaskId} 的Cron表达式无效: {item.Frequency}"); + continue; + } + var trigger1 = GetTriggerByTime(item.InterFaceTaskId, item.Frequency); + //给计划者添加Job和触发器 + jobAndTriggerMapping[jobDetail1] = trigger1; + } + catch (Exception ex) + { + ErrLogInfo.WriteLog($"处理任务ID {item.InterFaceTaskId} 时发生异常", ex); + jobAndTriggerMapping.Remove(GetJobDetailByInterFaceTaskId(item.InterFaceTaskId)); + continue; + } } var readOnlyjobAndTriggerMapping = new ReadOnlyDictionary>(jobAndTriggerMapping); await scheduler.ScheduleJobs(readOnlyjobAndTriggerMapping, true); await scheduler.Start(); //只有启动了,里面的任务才会定时触发 - Funs.ScheduledTasks = scheduler; - + Funs.ScheduledTasks = scheduler; // 仅在启动成功后赋值 } public static void ISchedulerShupDown(IScheduler scheduler) { scheduler.Shutdown(); - } + /// /// 同步任务调度 /// @@ -57,7 +78,16 @@ namespace BLL { StdSchedulerFactory factory = new StdSchedulerFactory(); var model = InterFaceTaskService.GetInterFaceTaskById(InterFaceTaskId); - // var item = Funs.ScheduledTasks.Where(x => x.Key == InterFaceTaskId).FirstOrDefault(); + if (Funs.ScheduledTasks == null) + { + ErrLogInfo.WriteLog("调度器未初始化"); + return; + } + if (Funs.ScheduledTasks == null) + { + ErrLogInfo.WriteLog("调度器未初始化"); + return; + } IScheduler scheduler = Funs.ScheduledTasks; JobKey jk = new JobKey(InterFaceTaskId, "group1"); if (model != null) @@ -69,40 +99,68 @@ namespace BLL var jobDetail1 = GetJobDetailByInterFaceTaskId(model.InterFaceTaskId); var trigger1 = GetTriggerByTime(model.InterFaceTaskId, model.Frequency); await scheduler.ScheduleJob(jobDetail1, trigger1, true); - } else { - var jobDetail1 = GetJobDetailByInterFaceTaskId(model.InterFaceTaskId); var trigger1 = GetTriggerByTime(model.InterFaceTaskId, model.Frequency); await scheduler.ScheduleJob(jobDetail1, trigger1, true); } - } else { if (scheduler.GetJobDetail(jk, default) != null) { await scheduler.DeleteJob(jk, default); - - // SyncScheduledTasks(model.InterFaceTaskId, scheduler, 2); } - } - } Funs.ScheduledTasks = scheduler; - } catch (Exception ex) { string a = ex.ToString(); throw; } - } + + public static async Task DeleteISchedulerById(string InterFaceTaskId) + { + try + { + StdSchedulerFactory factory = new StdSchedulerFactory(); + var model = InterFaceTaskService.GetInterFaceTaskById(InterFaceTaskId); + // var item = Funs.ScheduledTasks.Where(x => x.Key == InterFaceTaskId).FirstOrDefault(); + if (Funs.ScheduledTasks == null) + { + ErrLogInfo.WriteLog("调度器未初始化"); + return; + } + if (Funs.ScheduledTasks == null) + { + ErrLogInfo.WriteLog("调度器未初始化"); + return; + } + IScheduler scheduler = Funs.ScheduledTasks; + JobKey jk = new JobKey(InterFaceTaskId, "group1"); + if (model != null) + { + if (scheduler.GetJobDetail(jk, default) != null) + { + await scheduler.DeleteJob(jk, default); + // SyncScheduledTasks(model.InterFaceTaskId, scheduler, 2); + } + } + Funs.ScheduledTasks = scheduler; + } + catch (Exception ex) + { + string a = ex.ToString(); + throw; + } + } + /// /// 同步任务列表 /// @@ -136,24 +194,39 @@ namespace BLL } public static ReadOnlyCollection GetTriggerByTime(string InterFaceTaskId, string time) { - string cron = "0 0 0/& * * ? "; - // cron = cron.Replace("&", time); - cron = time; - // cron = "0 0/1 * * * ? "; - //创建触发器 - var trigger1 = new ReadOnlyCollection( - new List() + // 参数校验 + if (string.IsNullOrWhiteSpace(InterFaceTaskId)) { - TriggerBuilder.Create() - .WithIdentity(InterFaceTaskId, "group1") //给触发器身份 - .WithDescription("触发器的描述,方便查找") - .StartAt(new DateTimeOffset(DateTime.Now.AddSeconds(10))) //.StartNow()都是启动触发器方式 - .WithCronSchedule(cron) //定时策略,Cron表达式 - .Build() - }); - return trigger1; + throw new ArgumentNullException(nameof(InterFaceTaskId), "任务ID不能为空"); + } + if (string.IsNullOrWhiteSpace(time)) + { + throw new ArgumentNullException(nameof(time), "时间表达式不能为空"); + } + + try + { + // 验证是否为有效的Cron表达式 + CronExpression.ValidateExpression(time); + // 创建触发器 + var trigger = TriggerBuilder.Create() + .WithIdentity(InterFaceTaskId, "group1") // 给触发器身份 + .WithDescription("触发器的描述,方便查找") + .StartAt(new DateTimeOffset(DateTime.Now.AddSeconds(10))) // 10秒后开始 + .WithCronSchedule(time) // 使用传入的Cron表达式 + .Build(); + + return new ReadOnlyCollection(new List { trigger }); + } + catch (FormatException ex) + { + throw new ArgumentException("无效的Cron时间表达式", nameof(time), ex); + } + catch (Exception ex) + { + throw new Exception("创建触发器时发生错误", ex); + } } } -} - +} \ No newline at end of file