定时任务框架 Quartz.net

624 阅读2分钟

定时任务框架 Quartz.net 简介
Quartz.Net 是一个从 Java 版的 Quartz 移植过来定时任务框架,可以实现异常灵活的定时任务,开发人员只要写少量的代码就可以实现“每隔1小时执行”、“每天22点执行”、“每月 18 日的下午执行 8 次”等各种定时任务。 
1 Quartz.net 基本概念

 Quartz.Net 中的概念:计划者(IScheduler)、工作(IJob)、触发器(Trigger)。给计划者一个工作(Job),让他在 Trigger(什么条件下做这件事) 触发的条件下执行这个工作(Job)将要定时执行的任务的代码写到实现 IJob 接口的 Execute 方法中即可,时间到来的时候
Execute 方法会被调用。 

2 、用法

1) 安装 Quartz.net,版本变化太大,前后不兼容:Install-Package Quartz -Version 2.5.0 **
**2) 定义一个实现了 IJob 接口的类 TestJob,把要定时执行的代码写到 Execute 方法中 
3) 把下面代码写到程序启动的时候,初始化一次即可。\

IScheduler sched = new StdSchedulerFactory().GetScheduler();\
JobDetailImpl jdBossReport = new JobDetailImpl("jdTest",typeof(TestJob));//JobDetailImpl(string name, Type jobType) name参数必须是唯一,jobType参数是实现Tjob要执行的定时执行的代码\
IMutableTrigger triggerBossReport = CronScheduleBuilder.DailyAtHourAndMinute(23,45).Build();//每天 23:45 执行一次\
triggerBossReport.Key = new TriggerKey("triggerTest");//参数唯一\
sched.ScheduleJob(jdBossReport,triggerBossReport);\
sched.Start();

实现IJob的TestJob

3、 CronScheduleBuilder 其他定时模式
每 周 固 定 时 间 : CronScheduleBuilder.AtHourAndMinuteOnGivenDaysOfWeek(13, 55,DayOfWeek.Friday, DayOfWeek.Sunday) 每周五、周日的 13:55 执行; 
每周固定时间: CronScheduleBuilder.WeeklyOnDayAndHourAndMinute()
每月固定时间: CronScheduleBuilder.MonthlyOnDayAndHourAndMinute()
使用 Crond 表达式设定: CronScheduleBuilder.CronSchedule("0 0 10,14,16 * * ?") Crond 表达式介绍
www.cnblogs.com/junrong624/… 了解 crond 强大到什么程度 4 CalendarIntervalScheduleBuilder、SimpleScheduleBuilder 定时模式

IScheduler sched = new StdSchedulerFactory().GetScheduler();
            JobDetailImpl jobDetail = new JobDetailImpl("jdTest",typeof(Testjob));
            var builder = CalendarIntervalScheduleBuilder.Create();
            builder.WithInterval(3, IntervalUnit.Second);////每 3 秒钟执行一次  Second秒
            IMutableTrigger trigger = builder.Build();
            trigger.Key = new TriggerKey("triggerTest");
            sched.ScheduleJob(jobDetail, trigger);
            sched.Start();

5 IJob Execute 中异常问题 :由于Job是运行在单独的线程中的,Execute 发生异常在调试无法捕获异常,需要加Try catch 记录异常日志
6IJob 中怎么样 MapPath  由于Job是运行在单独的线程中的,通过HttpContext.Current是获取不到MapPath,需要使用HostingEnvironment.MapPath(),也不能在Job做Request、Session等和Web的相关工作
优秀的定时调度框架: HangFire hangfire.io/ 优点:带任务监控界面。 高级版收费 \