This commit is contained in:
parent
6726cdfb52
commit
9838c63107
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue