首页 > 其他分享 >QuartZ

QuartZ

时间:2023-03-01 15:00:43浏览次数:54  
标签:QuartZ Console Add job JobDataMap context 执行

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

相关文章

  • 如何在Windows窗体中使用Quartz .net?
    好!我浪费了太多时间来解决这个问题,使Quartz.net在windows窗体上工作。但是,我有一个通用的解决方案,我希望能帮助其他人。像往常一样创建IJOB类创建一个指向表单的静态......
  • Quartz的使用教程
    参考文档1HELLOWORLD程序实现每个五秒自动执行某个任务publicclassProgram{publicstaticvoidMain(){Run();......
  • Quartz与SpringBoot 搞定任务调度
    一、Quartz简介Quartz是OpenSymphony开源组织在Jobscheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百......
  • Quartz.Net 主要概念介绍和吐槽
    我们经常遇到需要定时执行某些任务的情况,比如清理缓存、异步结果轮询等,如果不打算造轮子,那么选择一款合适的定时任务组件就很关键了。所幸,.Net世界中的选项并不多:)选型主......
  • 基于Quartz的定时任务实现
    核心:QuartzScheduler:调度器,所有执行操作由scheduler统一管理Trigger:设置时间,间隔,次数JobDetail:任务的实例Job:任务业务逻辑依赖包<dependency><groupI......
  • quartz Cron 表达式包括以
    转的: Cron表达式包括以下7个字段:秒分小时月内日期月周内日期年(可选字段)特殊字符Cron触发器利用一系列特殊字符,如下所示:反斜线(/)字符表示增量值。例如,在秒字段中......
  • Quartz定时任务Cron表达式详解
    Quartz定时任务Cron表达式详解cron表达式用于配置cronTrigger的实例。cron表达式实际上是由七个子表达式组成。这些表达式之间用空格分隔。1.Seconds(秒)2.Minutes(分)3.H......
  • CentOS中部署jar包时提示:org.quartz.SchedulerException: Couldn‘t get host name
    场景jar包在本地Windows系统上运行不报错,在CentOS服务器上运行时提示:org.quartz.SchedulerException:Couldn'tgethostname 注:​​关注公众号霸道的程序猿获取编程......
  • Quartz.Net定时任务在IIS中不执行或多次执行解决方法
    环境WindowsServer2012R2IIS8不执行解决方法在IIS中打开程序对应的应用程序池【高级设置】1.设置应用程序池【回收】->【固定时间间隔(分钟)】为0。2.设置应用程序池......
  • SpringBoot 之 Quartz 使用
    一、Quartz简介用过Quartz的都懂,Quartz就是一个完全由java编写的开源作业调度框架。1、组件简介需要使用这个框架需要知道几个词。JobJob是一个任务接口,开发者定义......