using Quartz;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace IStation.Server
|
{
|
/// <summary>
|
/// 自定义计划服务任务
|
/// </summary>
|
public class CustomCronServiceJob : Quartz.IJob
|
{
|
private static List<CustomCronRepeatJobHelper> _jobHelpers = new List<CustomCronRepeatJobHelper>();
|
|
/// <summary>
|
///
|
/// </summary>
|
public Task Execute(IJobExecutionContext context)
|
{
|
return Task.Run(async () =>
|
{
|
try
|
{
|
#region 加载所有任务
|
|
var jobList = new Service.CustomCronJob().GetAll();
|
if (jobList == null || jobList.Count < 1)
|
{
|
LogHelper.Info("自定义计划服务任务中,未检索到自定义计划任务信息");
|
CancelJobs();
|
return;
|
}
|
jobList = jobList.Where(x => x.UseStatus == Model.eUseStatus.Enable).ToList();
|
if (jobList.Count < 1)
|
{
|
LogHelper.Info("自定义计划服务任务中,未检索到有效自定义计划任务信息");
|
CancelJobs();
|
return;
|
}
|
|
#endregion
|
|
#region 开启任务
|
|
foreach (var job in jobList)
|
{
|
var jobHelper = _jobHelpers.Find(t => t.Instance.ID == job.ID);
|
if (jobHelper == null)
|
{
|
jobHelper = new CustomCronRepeatJobHelper();
|
await jobHelper.StartJob(job);
|
_jobHelpers.Add(jobHelper);
|
LogHelper.Info($"自定义计划服务任务中:ID:{job.ID},NO:{job.NO},Name:{job.Name} 的任务开启!");
|
}
|
}
|
|
#endregion
|
|
#region 关闭任务
|
|
foreach (var jobHelper in _jobHelpers.ToList())
|
{
|
var job = jobList.Find(t => t.ID == jobHelper.Instance.ID);
|
if (job == null)
|
{
|
await jobHelper.CancelJob();
|
_jobHelpers.Remove(jobHelper);
|
LogHelper.Info($"自定义计划服务任务中:ID:{job.ID},NO:{job.NO},Name:{job.Name} 的任务关闭!");
|
continue;
|
}
|
|
if (job.Repeat != jobHelper.Instance.Repeat)
|
{
|
await jobHelper.CancelJob();
|
_jobHelpers.Remove(jobHelper);
|
var rJobHelper = new CustomCronRepeatJobHelper();
|
await rJobHelper.StartJob(job);
|
_jobHelpers.Add(rJobHelper);
|
}
|
}
|
|
#endregion
|
|
LogHelper.Info($"自定义计划服务任务中,开启任务数量为{_jobHelpers.Count}!");
|
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error("自定义计划服务任务中,执行出错", ex);
|
var e = new JobExecutionException(ex);
|
throw e;
|
}
|
});
|
|
|
}
|
|
/// <summary>
|
/// 取消任务
|
/// </summary>
|
public static void CancelJobs()
|
{
|
if (_jobHelpers != null && _jobHelpers.Count > 0)
|
{
|
_jobHelpers.ForEach(async x => await x.CancelJob());
|
_jobHelpers.Clear();
|
}
|
}
|
|
|
|
}
|
}
|