有时我们需要系统帮我们定时自动执行一些东西,这里用到 Quartz.net
Quartz.Net是纯净的,它是一个.Net程序集,是非常流行的Java作业调度系统Quartz的C#实现。
Quartz.Net一款功能齐全的任务调度系统,从小型应用到大型企业级系统都能适用。功能齐全体现在触发器的多样性上面,即支持简单的定时器,也支持Cron表达式;即能执行重复的作业任务,也支持指定例外的日历;任务也可以是多样性的,只要继承IJob接口即可。
对于小型应用,Quartz.Net可以集成到你的系统中,对于企业级系统,它提供了Routing支持,提供了Group来组织和管理任务,此外还有持久化、插件功能、负载均衡和故障迁移等满足不同应用场景的需要。
为了灵活使用,下面分享的是如何动态创建编辑任务
安装:Install-Package Quartz -Version 3.0.7
或者在 NuGet 中引用
帮助类:
public class QuartzConfigHelper
{
private static ISchedulerFactory sf = new StdSchedulerFactory(); //创建一个调度器工厂
private static String JOB_GROUP_NAME = ConfigurationManager.AppSettings["QuartzJobGroupName"];
private static String TRIGGER_GROUP_NAME = ConfigurationManager.AppSettings["QuartzTriggerGroupName"];
private static IScheduler sched; //创建一个调度器
#region 动态创建和编辑任务
/// <summary>
/// 创建一个定时任务
/// </summary>
/// <param name="jobName"></param>
/// <param name="jobType"></param>
/// <param name="jobkey"></param>
/// <param name="time"></param>
public static void StartJob(string jobName, Type jobType, string jobKeyname, string time)
{
sched = sf.GetScheduler().Result; //工厂生成一个调度器
JobDetailImpl jobDetail = new JobDetailImpl(); //新建一个任务
jobDetail.Name = jobName;
jobDetail.Group = JOB_GROUP_NAME;
jobDetail.Key = new JobKey(jobKeyname); //JobKey.Create(jobkey);
jobDetail.JobType = jobType;
CronTriggerImpl trigger = new CronTriggerImpl(jobName, TRIGGER_GROUP_NAME);//新建一个触发器
trigger.CronExpressionString = time; //Cron表达式
sched.ScheduleJob(jobDetail, trigger); //将任务与触发器添加到调度器中
if (!sched.IsShutdown)
{
sched.Start();
}
}
/**
* 从Scheduler 移除当前的Job,修改Trigger
*
* @param jobDetail
* @param time
* @throws SchedulerException
* @throws ParseException
*/
public static void ModifyJobTime(string jobName, Type jobType, string jobKeyname, string time, bool IsEdit = true)
{
sched = sf.GetScheduler().GetAwaiter().GetResult();
//创建之前的trigger
CronTriggerImpl trigger = new CronTriggerImpl(jobName, TRIGGER_GROUP_NAME);
//创建之前的job
JobDetailImpl jobDetail = new JobDetailImpl(); //新建一个任务
jobDetail.Name = jobName;
jobDetail.Group = JOB_GROUP_NAME;
jobDetail.Key = new JobKey(jobKeyname); //JobKey.Create(jobkey);
jobDetail.JobType = jobType;
// 移除当前进程的Job
sched.DeleteJob(jobDetail.Key);
if (IsEdit)
{
// 修改Trigger
trigger.CronExpressionString = time;
// 重新调度jobDetail
sched.ScheduleJob(jobDetail, trigger);
}
}
/// <summary>
/// 停止任务
/// </summary>
public static void ShutDownJob()
{
if (sched != null && !sched.IsShutdown)
{
sched.Shutdown();
}
}
#endregion
}
创建一个Job:
public class HelloQuartz:IJob
{
/// <summary>
/// 执行方法
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task Execute(IJobExecutionContext context)
{
//执行一些操作
}
}
调用:
string str = TimeToCron.TimeToQuartzCron(timestr);
QuartzConfigHelper.StartJob(ID.ToString(), typeof(HelloQuartz), ID.ToString(), str);
时间格式转换成Quartz任务调度器Cron表达式
public class TimeToCron
{
/// <summary>
/// 时间格式转换成Quartz任务调度器Cron表达式
/// </summary>
/// <param name="timeStr">时间值,支持yyyy-MM-dd HH:mm:ss | HH:mm</param>
/// <returns></returns>
public static string TimeToQuartzCron(string timeStr)
{
try
{
if (string.IsNullOrWhiteSpace(timeStr))
{
return "";
}
//日期
string date = Convert.ToDateTime(timeStr).ToString("yyyy-MM-dd");
DateTime dt = DateTime.Parse(date);
//时间
string time = Convert.ToDateTime(timeStr).ToString("HH:mm:ss");
string error = "传入的时间值[" + timeStr + "]格式有误!";
int ss = 0, mi = 0, hh = 0;
if (time.Length < 5)
{
throw new Exception(error);
}
if (time.Substring(2, 1) != ":")
{
throw new Exception(error);
}
if (!int.TryParse(time.Substring(0, 2), out hh))
{
throw new Exception(error);
}
if (!int.TryParse(time.Substring(3, 2), out mi))
{
throw new Exception(error);
}
if (time.Length > 5)
{
if (time.Substring(5, 1) != ":")
{
throw new Exception(error);
}
if (!int.TryParse(time.Substring(6), out ss))
{
throw new Exception(error);
}
}
if (ss > 59)
{
throw new Exception(error);
}
if (mi > 59)
{
throw new Exception(error);
}
if (hh > 23)
{
throw new Exception(error);
}
string cronValue = ss + " " + mi + " " + hh + " " + dt.Day.ToString() + " " + dt.Month.ToString() + " ? " + dt.Year.ToString();
return cronValue;
}
catch (Exception ea)
{
throw ea;
}
}
}