QuartZ
Quartz.NET是一个强大、开源、轻量级的任务调度框架。任务调度在我们的开发中经
常遇到,如说:每天晚上三点让程序或网站执行某些代码,或者每隔5秒种执行一个
方法等。Windows计划任务也能实现类似的任务调度,但是Quartz.net有一些有优秀
的特性,如:数据库支持,集群,插件,支持cron-like表达式等等。
官网地址:https://www.quartz-scheduler.net/blog.html
源码:https://github.com/quartznet/quartznet
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提供了不同环节的监控;任务执行的时候,每一个环节都要知道做了什么;

浙公网安备 33010602011771号