using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IStation.Server
{
///
/// 自定义计划重复任务
///
public class CustomCronRepeatJob : Quartz.IJob
{
//自定义计划任务字典
private static Dictionary _dict=new Dictionary();
///
/// 任务id
///
public long JobID { get; set; }
///
///
///
public Task Execute(IJobExecutionContext context)
{
return Task.Run(async () =>
{
try
{
//获取任务
var model = new Service.CustomCronJob().GetByID(JobID);
//获取任务失败后,停止任务并移除任务辅助类
if (model == null)
{
if (_dict.ContainsKey(JobID))
{
await _dict[JobID].CancelJob();
_dict.Remove(JobID);
}
return;
}
//尚未创建计划任务时,创建计划任务辅助类
if (!_dict.ContainsKey(JobID))
{
var jobHelper = new CustomCronJobHelper();
await jobHelper.StartJob(model);
_dict.Add(JobID, jobHelper);
return;
}
//任务已存在,检查任务执行间隔是否发生变化,若发生变化,重置任务
if (_dict[JobID].Instance.Expression != model.Expression)
{
await _dict[JobID].CancelJob();
var jobHelper = new CustomCronJobHelper();
await jobHelper.StartJob(model);
_dict[JobID] = jobHelper;
}
}
catch (Exception ex)
{
LogHelper.Error("自定义计划重复任务,执行出错", ex);
var e = new JobExecutionException(ex);
throw e;
}
});
}
///
/// 取消任务
///
///
public async Task CancelJob()
{
await CancelJob(JobID);
}
///
/// 取消任务
///
/// 任务id
public static async Task CancelJob(long jobId)
{
if (_dict.ContainsKey(jobId))
{
await _dict[jobId].CancelJob();
_dict.Remove(jobId);
}
}
///
/// 取下任务
///
public static async Task CancelJobs()
{
foreach (var key in _dict.Keys)
{
await CancelJob(key);
}
}
}
}