最近因为项目需要用到了Quartz,下面简单记录一下。
一、首先需要安装Quartz。
二、定义一个执行的Job类,实现IJob接口,接口有一个方法Execute,用来执行定时任务的实现内容。
public class HelloJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
Console.WriteLine("作业执行!");
}
}
三、定时触发,根据设定的时间间隔触发。
//从工厂中获取一个调度器实例化
IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();
await scheduler.Start(); //开启调度器
//==========例子1(简单使用)===========
IJobDetail job1 = JobBuilder.Create<HelloJob>() //创建一个作业
.WithIdentity("job", "group1")
.Build();
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("trigger", "group1")
.StartNow() //现在开始
.WithSimpleSchedule(x => x //触发时间,5秒一次。
.WithIntervalInSeconds(5)
.RepeatForever()) //不间断重复执行
.Build();
await scheduler.ScheduleJob(job1, trigger1); //把作业,触发器加入调度器。
四、仅触发一次,定时器在设定时间内,只触发一次。
IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();
IJobDetail job = JobBuilder.Create<HelloJob>() //创建一个作业
.WithIdentity("job3", "group3")
.Build();
ITrigger trigger = trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger3", "group3")
.StartAt(DateBuilder.FutureDate(1, IntervalUnit.Second)) //使用DateBuilder将来创建一个时间日期
.ForJob(job) //通过JobKey识别作业
.Build();
await scheduler.ScheduleJob(job,trigger);
await scheduler.Start();
五、移除定时任务
调用公共方法,实现定时任务移除
JobKey JKey = new JobKey("job", "group1");
TriggerKey TKey = new TriggerKey("trigger", "group1");
await QuartzHelper.RemoveJob(JKey, TKey);
封装了一个定时器的公共类,方便程序复用。
public static class QuartzHelper
{
public static async Task RemoveJob(JobKey jobKey, TriggerKey triggerKey)
{
try
{
var scheduler = await TaskDeadLineEndJob.GetSchedulerAsync();
var state = await scheduler.GetTriggerState(triggerKey);
if (state == TriggerState.None)
{
return;
}
await scheduler.PauseTrigger(triggerKey);// 停止触发器
await scheduler.UnscheduleJob(triggerKey);// 移除触发器
await scheduler.DeleteJob(jobKey);// 删除任务
}
catch (Exception)
{
throw;
}
}
}
定义一个工厂类,用来保证定时任务是唯一的,如果每次都new一个新实例,后面可能会出问题。
public class TaskDeadLineEndJob
{
private static IScheduler scheduler;
private static Task<IScheduler> TaskScheduler;
private static readonly object padlock = new object();
public static async Task<IScheduler> GetSchedulerAsync()
{
lock (padlock)
{
// 如果类的实例不存在则创建,否则直接返回
if (scheduler == null)
{
ISchedulerFactory schedf = new StdSchedulerFactory();
TaskScheduler = schedf.GetScheduler();
}
else
{
return scheduler;
}
}
return await TaskScheduler;
}
public TaskDeadLineEndJob()
{
try
{
Task.Run(async () =>
{
// 开启调度器
scheduler = await GetSchedulerAsync();
await scheduler.Start();
});
}
catch (Exception)
{
throw;
}
}
}