This commit is contained in:
夏菊 2025-12-11 10:37:45 +08:00
parent 6726cdfb52
commit 9838c63107
1 changed files with 112 additions and 39 deletions

View File

@ -2,7 +2,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; 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 System.Threading.Tasks;
using FineUIPro;
using Quartz; using Quartz;
using Quartz.Impl; using Quartz.Impl;
@ -13,39 +20,53 @@ namespace BLL
public static async Task Init() public static async Task Init()
{ {
ErrLogInfo.WriteLog("定时任务Init");
//初始化计划者 //初始化计划者
StdSchedulerFactory factory = new StdSchedulerFactory(); StdSchedulerFactory factory = new StdSchedulerFactory();
// StdSchedulerFactory factory = new StdSchedulerFactory(properties);
IScheduler scheduler = await factory.GetScheduler(); IScheduler scheduler = await factory.GetScheduler();
var jobAndTriggerMapping = new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>(); var jobAndTriggerMapping = new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>();
// 将映射关系包装成制度字典集合 // 将映射关系包装成制度字典集合
var model = new Model.InterFaceTask(); var model = new Model.InterFaceTask();
model.Enable = true; model.Enable = true;
var list = InterFaceTaskService.GetInterFaceTaskByModle(model); var list = InterFaceTaskService.GetInterFaceTaskByModle(model);
if (list == null || list.Count == 0)
{
ErrLogInfo.WriteLog("未找到任何启用的定时任务");
return;
}
foreach (var item in list) foreach (var item in list)
{ {
try
var jobDetail1 = GetJobDetailByInterFaceTaskId(item.InterFaceTaskId); {
var trigger1 = GetTriggerByTime(item.InterFaceTaskId, item.Frequency); var jobDetail1 = GetJobDetailByInterFaceTaskId(item.InterFaceTaskId);
//给计划者添加Job和触发器 if (!CronExpression.IsValidExpression(item.Frequency))
jobAndTriggerMapping[jobDetail1] = trigger1; {
//keyValuePairs.Add(item.InterFaceTaskId, scheduler); ErrLogInfo.WriteLog($"任务ID {item.InterFaceTaskId} 的Cron表达式无效: {item.Frequency}");
//Funs.ScheduledTasks = keyValuePairs; 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<IJobDetail, IReadOnlyCollection<ITrigger>>(jobAndTriggerMapping); var readOnlyjobAndTriggerMapping = new ReadOnlyDictionary<IJobDetail, IReadOnlyCollection<ITrigger>>(jobAndTriggerMapping);
await scheduler.ScheduleJobs(readOnlyjobAndTriggerMapping, true); await scheduler.ScheduleJobs(readOnlyjobAndTriggerMapping, true);
await scheduler.Start(); //只有启动了,里面的任务才会定时触发 await scheduler.Start(); //只有启动了,里面的任务才会定时触发
Funs.ScheduledTasks = scheduler; Funs.ScheduledTasks = scheduler; // 仅在启动成功后赋值
} }
public static void ISchedulerShupDown(IScheduler scheduler) public static void ISchedulerShupDown(IScheduler scheduler)
{ {
scheduler.Shutdown(); scheduler.Shutdown();
} }
/// <summary> /// <summary>
/// 同步任务调度 /// 同步任务调度
/// </summary> /// </summary>
@ -57,7 +78,16 @@ namespace BLL
{ {
StdSchedulerFactory factory = new StdSchedulerFactory(); StdSchedulerFactory factory = new StdSchedulerFactory();
var model = InterFaceTaskService.GetInterFaceTaskById(InterFaceTaskId); 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; IScheduler scheduler = Funs.ScheduledTasks;
JobKey jk = new JobKey(InterFaceTaskId, "group1"); JobKey jk = new JobKey(InterFaceTaskId, "group1");
if (model != null) if (model != null)
@ -69,40 +99,68 @@ namespace BLL
var jobDetail1 = GetJobDetailByInterFaceTaskId(model.InterFaceTaskId); var jobDetail1 = GetJobDetailByInterFaceTaskId(model.InterFaceTaskId);
var trigger1 = GetTriggerByTime(model.InterFaceTaskId, model.Frequency); var trigger1 = GetTriggerByTime(model.InterFaceTaskId, model.Frequency);
await scheduler.ScheduleJob(jobDetail1, trigger1, true); await scheduler.ScheduleJob(jobDetail1, trigger1, true);
} }
else else
{ {
var jobDetail1 = GetJobDetailByInterFaceTaskId(model.InterFaceTaskId); var jobDetail1 = GetJobDetailByInterFaceTaskId(model.InterFaceTaskId);
var trigger1 = GetTriggerByTime(model.InterFaceTaskId, model.Frequency); var trigger1 = GetTriggerByTime(model.InterFaceTaskId, model.Frequency);
await scheduler.ScheduleJob(jobDetail1, trigger1, true); await scheduler.ScheduleJob(jobDetail1, trigger1, true);
} }
} }
else else
{ {
if (scheduler.GetJobDetail(jk, default) != null) if (scheduler.GetJobDetail(jk, default) != null)
{ {
await scheduler.DeleteJob(jk, default); await scheduler.DeleteJob(jk, default);
// SyncScheduledTasks(model.InterFaceTaskId, scheduler, 2); // SyncScheduledTasks(model.InterFaceTaskId, scheduler, 2);
} }
} }
} }
Funs.ScheduledTasks = scheduler; Funs.ScheduledTasks = scheduler;
} }
catch (Exception ex) catch (Exception ex)
{ {
string a = ex.ToString(); string a = ex.ToString();
throw; 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;
}
}
/// <summary> /// <summary>
/// 同步任务列表 /// 同步任务列表
/// </summary> /// </summary>
@ -136,24 +194,39 @@ namespace BLL
} }
public static ReadOnlyCollection<ITrigger> GetTriggerByTime(string InterFaceTaskId, string time) public static ReadOnlyCollection<ITrigger> GetTriggerByTime(string InterFaceTaskId, string time)
{ {
string cron = "0 0 0/& * * ? "; // 参数校验
// cron = cron.Replace("&", time); if (string.IsNullOrWhiteSpace(InterFaceTaskId))
cron = time;
// cron = "0 0/1 * * * ? ";
//创建触发器
var trigger1 = new ReadOnlyCollection<ITrigger>(
new List<ITrigger>()
{ {
TriggerBuilder.Create() throw new ArgumentNullException(nameof(InterFaceTaskId), "任务ID不能为空");
.WithIdentity(InterFaceTaskId, "group1") //给触发器身份 }
.WithDescription("触发器的描述,方便查找")
.StartAt(new DateTimeOffset(DateTime.Now.AddSeconds(10))) //.StartNow()都是启动触发器方式
.WithCronSchedule(cron) //定时策略Cron表达式
.Build()
});
return trigger1;
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<ITrigger>(new List<ITrigger> { trigger });
}
catch (FormatException ex)
{
throw new ArgumentException("无效的Cron时间表达式", nameof(time), ex);
}
catch (Exception ex)
{
throw new Exception("创建触发器时发生错误", ex);
}
} }
} }
} }