Quartz 作业调度框架的使用
之前做一个OA项目,多个数据库数据同步,解决方法是用window系统的任务计划定时去执行脚本文件,很不方便,因为脚本文件可能会执行发生异常,需要去服务器调试,最近看到Quartz框架,可以将数据库同步放在OA系统内去定时执行,这样可以方便很多。
Quartz框架目前最新是3.0版本,官网: https://www.quartz-scheduler.net/
Demo:
1.引入Quartz.dll ,可以在官网下载后引入,也可以在VS中NuGet包管理器中引入。
2.简单建立一个控制台项目:
static void Main(string[] args)
{
Console.WriteLine("工作调度开始,当前时间为:"+DateTime.Now.ToString());
//1. 调度器工厂
ISchedulerFactory factory = new StdSchedulerFactory();
//2. 创建一个调度器
Task<IScheduler> taskScheduler = factory.GetScheduler();
IScheduler scheduler = taskScheduler.Result;
IJobDetail job = JobBuilder.Create<JobDemo>().Build();
IJobDetail job2 = JobBuilder.Create<JobDemo2>().Build();
//3、创建一个触发器
// 开始执行时间 与 结束时间
DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddHours(2), 2);
//DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now, 1);
//DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.MaxValue.AddDays(-1), 1);
//每隔 10s 触发一次
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
.WithCronSchedule("0/10 * * * * ?")
.Build();
//每隔 3s 触发一次,一百次后结束,这里不规定最大触发次数默认为1次
ISimpleTrigger trigger2 = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
.WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(100))
.Build();
//4、将任务与触发器添加到调度器中
scheduler.ScheduleJob(job, trigger);
scheduler.ScheduleJob(job2, trigger2);
//5、开始执行
scheduler.Start();
Console.ReadKey();
}
public class JobDemo : IJob
{
public async Task Execute(IJobExecutionContext context)
{
Console.WriteLine(DateTime.Now.ToString()+ " ---Trigger 1---");
}
}
public class JobDemo2 : IJob
{
public async Task Execute(IJobExecutionContext context)
{
Console.WriteLine(DateTime.Now.ToString() + " ---Trigger 2---");
}
}
3.执行结果:
注意: 在项目中使用IIS发布项目时,需要将程序池的线程回收机制关闭。
源码: https://github.com/wangqilong1225/C-Sharp-Test/tree/master/QuartzDemo
推荐相关博客:
https://www.cnblogs.com/knowledgesea/p/4930469.html (注意是 Quartz 3.0 之前的框架)
https://www.cnblogs.com/shanyou/p/8269641.html (Quartz 3.0 特性)
https://www.cnblogs.com/lihaiming93/p/6619124.html (cronschedule 时间的使用)
http://cron.qqe2.com/