zoukankan      html  css  js  c++  java
  • Quartz任务调度学习

    Quartz

    林老师带你学编程:https://blog.csdn.net/linzhiqiang0316/article/details/80588313?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 干货!!!

    灵感:https://www.cnblogs.com/davidwang456/p/3858980.html

                    Quartz提供了JobExecutionContext上下文通过JobDataMap传递数据。

     

    代码文件

    功能要点

    设置数据

    QuartzConfig.java

    创建JobDetail或者Trigger时,调用usingJobData()设置数据

    读取数据

    QuartzJob.java

    执行任务时,调用JobExecutionContext.getMergedJobDataMap()获取数据


    Quartz是Java领域最著名的开源任务调度工具,是一个任务调度框架,通过触发器设置作业的定时运行规则,来执行定时任务。其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。
    Quartz提供了极为广泛的特性如持久化任务,集群和分布式任务等

    Quartz框架主要核心组件包括:
    1.Scheduler任务调度
    是最核心的概念,需要把JobDetail和Trigger注册到scheduler中,才可以执行。
    工厂模式,组装各个组件 sched.scheduleJob(job, trigger);

    2.Job任务,JobExecutionContext类提供调度上下文的各种信息
    其实Job是接口,其中只有一个execute方法,我们只需要 implements 此接口,重写 execute(*) 方法。
     实现Job接口的类还可以使用注解进行修饰
           @DisallowConcurrentExecution:此注解表示不允许这个Job并发执行

           @PersistJobDataAfterExecution:此注解表示当这个Job的execute方法执行成功后,更新并存储它所持有的JobDetail属性中JobDataMap。如果使用这个注解,强烈建议也使用@DisallowConcurrentExecution,因为并发执行过程中,JobDataMap有可能会发生冲突。

    3.Trigger触发器/TruggerBuilder(创建Trigger)/ThreadPool(线程)
    执行任务的规则;比如每天,每小时等。
          一般情况使用SimpleTrigger,和CronTrigger,这些触发器实现了Trigger接口。或者 ScheduleBuilder 子类 SimpleScheduleBuilder和CronScheduleBuilder。
          对于简单的时间来说,比如每天执行几次,使用SimpleTrigger。
          对于复杂的时间表达式来说,比如每个月15日上午几点几分,使用CronTrigger以及CromExpression 类。
         Priority:这个属性表示Trigger的权重。当两个Trigger触发时间相同时,权重大的那个先执行。Quartz默认的权重值为5。
         Misfire Instruction:在Trigger接口中可以设置错过触发处理机制

    4.JobDetail任务细节/JobBuilder(创建JobDetail)/JobStore保存Job数据:保存内存或数据库中)/JobDataMap:JSON数据格式
        任务细节,Quartz执行Job时,需要新建个Job实例,但是不能直接操作Job类,所以通过JobDetail来获取Job的名称、描述信息。
    JobDetail有两个boolean属性。
        isDurable:如果设为false,则对应的Job一旦没有关联的触发器,就会被Scheduler自动删除。 requestsRecovery:如果设为true,当Job执行中遇到硬中断(例如运行崩溃、机器断电等),Scheduler会重新执行。这种情况下,
       JobExecutionContext.isRecovering()会返回ture。

    5.Calendar(排除某个任务不执行)
    一个Trigger可以和多个Calendar关联

    6.监听器JobListener TriggerListener SchedulerListener

    7.JobKey 和 TriggerKey
    在Quartz中,可以分别通过JobKey和TriggerKey来唯一地识别一个Job或一个Trigger。
    这两个Key都有两个关键属性:name和group。

    调度器作为作业的总指挥,触发器作为作业的操作者,作业为应用的功能模块。

    CronExpression表达式
    CronTrigger配置完整可是为:[秒] [分] [小时] [日] [月] [周] [年](年可选)
    * 表示所有值
    ? 表示不指定值,例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
    - 表示区间, 例如在小时上设置 "10-12",表示 10,11,12点都会触发。
    /用于递增触发,例如在秒上面设置"5/15"表示从5秒开始,每增15秒触发(5,20,35,50)。在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次
    L 表示最后的意思, 例如在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"
    W 表示离指定日期的最近那个工作日(周一至周五)
      例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发。如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-")。

    小提示:'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发;周字段的设置,若使用英文字母是不区分大小写的,即MON与mon相同。

    # 表示 每月的第几个周几
      例如在周字段上设置"6#3"表示在每月的第三个周六。注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)。
    注:表中月份一行的JAN-DEC,是指一月到十二月的英文缩写;星期一行的SUN-SAT,是指星期天到星期六的英文缩写。

    表达式案例

    在Quartz中有两类线程模型:
    1.Scheduler调度线程:QuartzSchedulerThread调度主线程QuartzScheduler被创建时创建一个QuartzSchedulerThread实例。
    2.任务执行线程:任务执行线程Quartz不会在主线程(QuartzSchedulerThread)中处理用户的Job。

    代码实践参考:https://www.cnblogs.com/jingmoxukong/p/5647869.html

  • 相关阅读:
    基于微信小程序的票价和时间选择以及计算总价
    基于Echarts的股票K线图展示
    基于Echarts的中国地图数据展示
    微信公众号网页授权登录获取用户基本信息
    springboot+mybatis+maven角色权限框架
    java服务端微信小程序支付
    推理 —— 猜帽子颜色
    Java 容器的使用及数组、List、Set 的相互转换
    构建工具 —— Groovy 与 Gradle
    效率生产力工具 —— idea 插件
  • 原文地址:https://www.cnblogs.com/Bkxk/p/11177075.html
Copyright © 2011-2022 走看看