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提供了不同环节的监控;任务执行的时候,每一个环节都要知道做了什么;
posted @ 2023-03-01 14:55  啊樊  阅读(36)  评论(0)    收藏  举报