Quartz.NET是一个强大、开源、轻量级的任务调度框架。任务调度在我们的开发中经 常遇到,如说:每天晚上三点让程序或网站执行某些代码,或者每隔5秒种执行一个 方法等。Windows计划任务也能实现类似的任务调度,但是Quartz.net有一些有优秀 的特性,如:数据库支持,集群,插件,支持cron-like表达式等等。 官网地址:https://www.quartz-scheduler.net/blog.html 源码:https://github.com/quartznet/quartznet 事例:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html Scheduler:调度器,quartz工作时的独立容器 Trigger:触发器,定义了调度任务的时间规则 Job:调度的任务 ThreadPool:线程池(不是clr中的线程池),任务最终交给线程池中的线程执行 JobStore:RAWStore和DbStore两种,job和trigger都存放在JobStore中 TriggerBuilder TriggerBuilder顾名思义就是用来创建Trigger的; Quartz.net提供了四种触发策略 1.SimpleSchedule 简单计划 2.CalendarIntervalSchedule 日历间隔计划 3.DailyTimeIntervalSchedule 每日间隔计划 4.CronSchedule。 Cron计划 一、Quart初步使用 1.Nuget引入QuartZ程序集 2.创建一个Scheduler任务调度容器(任务调度都是通过Scheduler来的) 3.指定时间策略() 4.指定具体要执行的Job 5.把策略和任务放入到Scheduler 6.Scheduler.Start();//开始 代码部分 创建一个容器scheduler 然后创建一个调度的任务IJobDetail 和定时器ITrigger 把调度任务和定时器放到容易中,就可以执行任务了
public class SendMessageJob : IJob { /// <summary> /// 这里定义具体要做的事情 /// </summary> /// <param name="context"></param> /// <returns></returns> public Task Execute(IJobExecutionContext context) { return Task.Run(() => { Console.WriteLine("这是要做的事情"); }); } }
static void Main(string[] args) { StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = factory.GetScheduler().Result;// //指定具体做什么事儿,Job IJobDetail job = JobBuilder.Create<SendMessageJob>().Build(); //指定时间策略 ITrigger trigger = TriggerBuilder.Create() //.WithCronSchedule .WithSimpleSchedule(build => { build.WithIntervalInSeconds(3).RepeatForever(); //设置时间间隔,时分秒 //.WithMisfireHandlingInstructionFireNow() // .WithRepeatCount(3); //设置执行次数,总共执行3+1次, }) .Build(); //第二种通过表达式来执行 ITrigger trigger = TriggerBuilder.Create() .StartAt(DateTime.Now)//什么时候开始执行 .WithIdentity("tname1", "group1") .WithDescription("高级班的QuartZ") .WithCronSchedule("3/5 * * * * ?") //五秒执行一次 .Build(); scheduler.ScheduleJob(job, trigger); scheduler.Start(); Console.ReadKey(); }二、传递参数 1.Job 传参:job.JobDataMap.Add()增加key-value参数,在Job,通过job.JobDataMap.Get方法获取 2.Trigger传递参数: trigger.JobDataMap.Add()添加参数,context.Trigger.JobDataMap.GetInt("Year")获取参数 3.MergedJobDataMap合并获取参数;后者会覆盖前者; 任务中传递参数 job.JobDataMap.Add(key,value) 通过键值对传递然后在任务中获取
IJobDetail job = JobBuilder.Create<SendMessageJob>().Build(); job.JobDataMap.Add("student1", "落羽"); job.JobDataMap.Add("student2", "赤"); job.JobDataMap.Add("student3", "自由飞翔"); job.JobDataMap.Add("student4", "小刘"); job.JobDataMap.Add("Year", DateTime.Now.Year);通过 context.JobDetail.JobDataMap.GetString(key) 来获取传过来的参数
public Task Execute(IJobExecutionContext context) { return Task.Run(() => { Console.WriteLine("******************JobDetail.JobDataMap.Get******************"); Console.WriteLine(context.JobDetail.JobDataMap.GetString("student1")); Console.WriteLine(context.JobDetail.JobDataMap.GetString("student2")); Console.WriteLine(context.JobDetail.JobDataMap.GetString("student3")); Console.WriteLine(context.JobDetail.JobDataMap.GetString("student4")); Console.WriteLine(context.JobDetail.JobDataMap.GetInt("Year")); Console.WriteLine("这是要做的事情"+DateTime.Now); }); }三、Add和Put 有什么区别? 需求:下一次执行任务需要的参数,是本次执行的结果;每一次来执行任务的时候,需要上一次执行任务的结果---有状态;标记特性PersistJobDataAfterExecution+put 方法 我们自己可不可以做? 四、循环往复的任务执行;每5s 执行一次,执行的任务很耗时,耗时大于5s, 增加特性保证任务不回重叠执行 特性:[DisallowConcurrentExecution]
[PersistJobDataAfterExecution] //下一次执行可以本次的结果 [DisallowConcurrentExecution] //不让任务在同一段时间内执行 public class SendMessageJob : IJob {}五、三大角色的意义: //1.为什么要分开---单一职责; //2.更加灵活装配 //更新字段: //更新A表中的某一个字段 //更新B表中的某一个字段 //跟新C表中的某一个字段 //跟新D表中的某一个字段 //跟新E表中的某一个字段 //就可以只定义一个Job,表名称+字段名称,当做参数传递过来;一个job解决多个问题;去掉重复 //角色分开以后,就可以自由的配置时间,让一个job 在不同的时间点去执行任务(更加灵活一些) //五、执行的时候回有很多个环节--QuartZ提供了不同环节的监控;任务执行的时候,每一个环节都要知道做了什么; 标签:QuartZ,Console,Add,job,JobDataMap,context,执行 From: https://www.cnblogs.com/FanJunCheng521/p/17168182.html