Quartz任务调度学习

Quartzhtml

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

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

                Quartz提供了JobExecutionContext上下文经过JobDataMap传递数据。编程

 

代码文件并发

功能要点框架

设置数据分布式

QuartzConfig.java工具

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

读取数据url

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