一、概述
1、简介
(1)、项目创立于1998年, 不间断更新,活跃度高。
(2)、纯Java设计,设计用于JavaSE、JavaEE, 方便集成于:JVM、JMI
(3)、官网
http://www.quartz-scheduler.org/
(4)、cron表达式辅助工具
http://www.cronmaker.com/
2、功能
(1)、核心概念
scheduler ---> 调度器
trigger ---> 触发器
job ---> 调度任务对象
jobDetail ---> 调度任务描述
listener ---> 调度监听
calendar ---> 调度时间点
(2)、支持集群
org.quartz.jobStore.isClustered
(3)、支持任务恢复
requestsRecovery
3、示例
// (1)、通过SchedulerFactory构建Scheduler对象
Scheduler sched = sf.getScheduler();
// (2)、声明 CronTrigger 触发器
CronTrigger trigger = new CronTrigger("helloWorldTrigger", "cronGroup", "1/1 * * * * ?");
// (3)、声明 JobDetail(将 job 等属性赋值给JobDetail)
JobDetail job = new JobDetail("helloWorldJob", Scheduler.DEFAULT_GROUP, HelloWorldJob.class);
// (4)、工厂模式,组装各个组件<JOB,Trigger>
sched.scheduleJob (job, trigger);
// (5)、start
sched.start();
4、流程图
(1)、创建调度工厂 ---> 工厂模式
(2)、根据工厂取得调度器实例 ---> 工厂模式
(3)、Builder模式构建子组件<Job,Trigger> ---> builder模式, 如JobBuilder、TriggerBuilder、DateBuilder
(4)、通过调度器组装子组件,调度器.组装<子组件1,子组件2...> ---> 工厂模式
(5)、调度器.start ---> 工厂模式
二、入门(居于 Quartz 1.*)
1、目录结构和内容
docs/api ---> Quartz 框架的JavaDoc Api 说明文档
docs/dbTables ---> 创建 Quartz 的数据库对象的脚本
docs/wikidocs ---> Quartz 的帮助文件,点击 index.html 开始查看
Examples ---> 多方面使用 Quartz 的例子Lib Quartz 使用到的第三方包
src/java/org/quartz ---> 使用 Quartz 的客户端程序源代码,公有 API
src/java/org/quartz/core ---> 使用 Quartz 的服务端程序源代码,私有 API
src/java/org/quartz/simpl ---> Quartz 提供的不衣赖于第三方产品的简单实现
src/java/org/quartz/impl ---> 依赖于第三方产品的支持模块的实现
src/java/org/quartz/utils ---> 整个框架要用到的辅助类和工具组件
注:Quartz 框架包含许多的类和接口,它们分布在大概 11 个包中。多数所要使用到的类或接口放置在 org.quartz 包中。这个包含盖了 Quartz 框架的公有 API.
2、Scheduler
(1)、作用
负责对用户定义的所有任务进行调度的类
(2)、SchedulerFactory ---> 调度工厂
a、StdSchedulerFactory
Quartz默认的SchedulerFactory,依赖于属性类(Properties)决定如何生产 Scheduler 实例
properties加载顺序:
检查 System.getProperty("org.quartz.properties") 中是否设置了别的文件名
使用 quartz.properties 作为要加载的文件名
试图从当前工作目录中加载这个文件
试图从系统 classpath 下加载这个文件
Quartz jar包中有一个默认的 quartz.properties 文件
b、DirectSchedulerFactory
对SchedulerFactory的直接实现, 通过它可以直接构建Scheduler、threadpool 等
-- 最简单
public void createScheduler(ThreadPool threadPool, JobStore jobStore);
-- 最复杂
public void createScheduler(String schedulerName, String schedulerInstanceId,ThreadPool threadPool, JobStore jobStore, String rmiRegistryHost, int rmiRegistryPort);
(3)、Scheduler
a、启动 Scheduler
scheduler.start();
b、销毁 Scheduler
scheduler.shutdown();
c、StdScheduler
Quartz默认的Scheduler
d、RemoteScheduler
带有RMI功能的Scheduler
3、Trigger
(1)、作用
描述触发Job执行的时间触发规则。
调度类(Scheduler)在 特定时间 调用此类,再由trigger类调用指定的定时程序。
(2)、SimpleTrigger
a、作用
用于按频率调度 指定任务
b、常用属性
jobDetail ---> 指定调度任务
repeatInterval ---> 指定间隔时间
repeatCount ---> 指定次数,默认无穷次
startDelay ---> 指定延迟多少毫秒启动调度,默认立即
startTime ---> 指定某个时间点启动调试,默认立即
(3)、CronTriggerBean
a、作用
用于按时间点调度 指定任务;使用Linux的Cron表达式 定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成
b、常用属性
jobDetail ---> 指定调度任务
cronExpression ---> 指定重复执行的时间点
c、cron表达式
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
注:星期与日期不可同时指定。
d、cron特殊字符
* ---> 表示任意
? ---> 表示不设置
- ---> 表达一个范围
, ---> 表达一个列表值
/ ---> x/y表达一个等步长序列,x为起始值,y为增量步长值
L ---> 该字符只在日期和星期字段中使用,代表“Last”的意思
W ---> 该字符只能出现在日期字段里,表示离该日期最近的工作日
LW组合 ---> 在日期字段可以组合使用LW,它的意思是当月的最后一个工作日
# ---> 该字符只能在星期字段中使用,表示当月某个工作日: 6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个)
C ---> 该字符只在日期和星期字段中使用,计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期: 5C在日期字段中就相当于日历5日以后的第一天
(4)、其他 Trigger(不同版本有不同扣展)
DateIntervalTrigger ---> 日期间隔触发的Trigger
4、JOB 接口 ---> 调度任务接口
(1)、作用
触发器在被触发后进行的操作,可以指定任意一个类的某个方法。
(2)、JobExecutionContext
JOB上下文,保存着Trigger、 JobDetail 等信息
(3)、定义的方法
public void execute(JobExecutionContext context) throws JobExecutionException;
(4)、JobDetail
a、作用
描述Job的实现类及其它相关的静态信息。
b、原理(看参见 "一、3、(3)")
Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job
c、作用
JobDetail不存储Job的实例,但它允许你定义一个实例,JobDetail 又指向JobDataMap
JobDetail持有Job的详细信息,如它所属的组,名称等信息
(4)、JobDataMap
a、作用
保存着任务实例的对象,并保持着他们状态信息,它是Map接口的实现,即你可以往里面put和get一些你想存储和获取的信息.
b、使用
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
注: 在Quartz 1.5之后,JobDataMap在 Trigger 级也是可用的。
实际使用中trigger级别有时取不到map中的值, 使用getMergedJobDataMap 可以获取到
(5)、StatefulJob
a、作用
代表有状态的任务,该接口是一个没有方法的标签接口,其目的是让Quartz知道任务的类型,以便采用不同的执行方案。
b、与Job的区分
无状态任务在执行时拥有自己的JobDataMap拷贝,对JobDataMap的更改不会影响下次的执行。
有状态任务共享同一个JobDataMap实例,每次任务执行对JobDataMap所做的更改会保存下来,后面的执行可以看到这个更改,也即每次执行任务后都会对后面的执行发生影响。
无状态的Job可以并发执行,而有状态的StatefulJob不能并发执行: 如果前次的StatefulJob还没有执行完毕,下一次的任务将阻塞等待,直到前次任务执行完毕。
(6)、原生Job实现
org.quartz.jobs.FileScanJob ---> 检查某个指定文件是否变化,并在文件被改变时通知到相应监听器的 Job
org.quartz.jobs.FileScanListener ---> 在文件被修改后通知 FileScanJob 的监听器
org.quartz.jobs.NativeJob ---> 用来执行本地程序(如 windows 下 .exe 文件) 的 Job
org.quartz.jobs.NoOpJob ---> 什么也不做。一些用户甚至仅仅用它来导致一个监听器的运行
org.quartz.jobs.ee.mail.SendMailJob ---> 使用 JavaMail API 发送 e-mail 的 Job
org.quartz.jobs.ee.jmx.JMXInvokerJob ---> 调用 JMX bean 上的方法的 Job
org.quartz.jobs.ee.ejb.EJBInvokerJob ---> 用来调用 EJB 上方法的 Job
注:一个job可以对应多个Trgger , 一个Trigger只能对应一个job .
1、简介
(1)、项目创立于1998年, 不间断更新,活跃度高。
(2)、纯Java设计,设计用于JavaSE、JavaEE, 方便集成于:JVM、JMI
(3)、官网
http://www.quartz-scheduler.org/
(4)、cron表达式辅助工具
http://www.cronmaker.com/
2、功能
(1)、核心概念
scheduler ---> 调度器
trigger ---> 触发器
job ---> 调度任务对象
jobDetail ---> 调度任务描述
listener ---> 调度监听
calendar ---> 调度时间点
(2)、支持集群
org.quartz.jobStore.isClustered
(3)、支持任务恢复
requestsRecovery
3、示例
// (1)、通过SchedulerFactory构建Scheduler对象
Scheduler sched = sf.getScheduler();
// (2)、声明 CronTrigger 触发器
CronTrigger trigger = new CronTrigger("helloWorldTrigger", "cronGroup", "1/1 * * * * ?");
// (3)、声明 JobDetail(将 job 等属性赋值给JobDetail)
JobDetail job = new JobDetail("helloWorldJob", Scheduler.DEFAULT_GROUP, HelloWorldJob.class);
// (4)、工厂模式,组装各个组件<JOB,Trigger>
sched.scheduleJob (job, trigger);
// (5)、start
sched.start();
4、流程图
(1)、创建调度工厂 ---> 工厂模式
(2)、根据工厂取得调度器实例 ---> 工厂模式
(3)、Builder模式构建子组件<Job,Trigger> ---> builder模式, 如JobBuilder、TriggerBuilder、DateBuilder
(4)、通过调度器组装子组件,调度器.组装<子组件1,子组件2...> ---> 工厂模式
(5)、调度器.start ---> 工厂模式
二、入门(居于 Quartz 1.*)
1、目录结构和内容
docs/api ---> Quartz 框架的JavaDoc Api 说明文档
docs/dbTables ---> 创建 Quartz 的数据库对象的脚本
docs/wikidocs ---> Quartz 的帮助文件,点击 index.html 开始查看
Examples ---> 多方面使用 Quartz 的例子Lib Quartz 使用到的第三方包
src/java/org/quartz ---> 使用 Quartz 的客户端程序源代码,公有 API
src/java/org/quartz/core ---> 使用 Quartz 的服务端程序源代码,私有 API
src/java/org/quartz/simpl ---> Quartz 提供的不衣赖于第三方产品的简单实现
src/java/org/quartz/impl ---> 依赖于第三方产品的支持模块的实现
src/java/org/quartz/utils ---> 整个框架要用到的辅助类和工具组件
注:Quartz 框架包含许多的类和接口,它们分布在大概 11 个包中。多数所要使用到的类或接口放置在 org.quartz 包中。这个包含盖了 Quartz 框架的公有 API.
2、Scheduler
(1)、作用
负责对用户定义的所有任务进行调度的类
(2)、SchedulerFactory ---> 调度工厂
a、StdSchedulerFactory
Quartz默认的SchedulerFactory,依赖于属性类(Properties)决定如何生产 Scheduler 实例
properties加载顺序:
检查 System.getProperty("org.quartz.properties") 中是否设置了别的文件名
使用 quartz.properties 作为要加载的文件名
试图从当前工作目录中加载这个文件
试图从系统 classpath 下加载这个文件
Quartz jar包中有一个默认的 quartz.properties 文件
b、DirectSchedulerFactory
对SchedulerFactory的直接实现, 通过它可以直接构建Scheduler、threadpool 等
-- 最简单
public void createScheduler(ThreadPool threadPool, JobStore jobStore);
-- 最复杂
public void createScheduler(String schedulerName, String schedulerInstanceId,ThreadPool threadPool, JobStore jobStore, String rmiRegistryHost, int rmiRegistryPort);
(3)、Scheduler
a、启动 Scheduler
scheduler.start();
b、销毁 Scheduler
scheduler.shutdown();
c、StdScheduler
Quartz默认的Scheduler
d、RemoteScheduler
带有RMI功能的Scheduler
3、Trigger
(1)、作用
描述触发Job执行的时间触发规则。
调度类(Scheduler)在 特定时间 调用此类,再由trigger类调用指定的定时程序。
(2)、SimpleTrigger
a、作用
用于按频率调度 指定任务
b、常用属性
jobDetail ---> 指定调度任务
repeatInterval ---> 指定间隔时间
repeatCount ---> 指定次数,默认无穷次
startDelay ---> 指定延迟多少毫秒启动调度,默认立即
startTime ---> 指定某个时间点启动调试,默认立即
(3)、CronTriggerBean
a、作用
用于按时间点调度 指定任务;使用Linux的Cron表达式 定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成
b、常用属性
jobDetail ---> 指定调度任务
cronExpression ---> 指定重复执行的时间点
c、cron表达式
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
注:星期与日期不可同时指定。
d、cron特殊字符
* ---> 表示任意
? ---> 表示不设置
- ---> 表达一个范围
, ---> 表达一个列表值
/ ---> x/y表达一个等步长序列,x为起始值,y为增量步长值
L ---> 该字符只在日期和星期字段中使用,代表“Last”的意思
W ---> 该字符只能出现在日期字段里,表示离该日期最近的工作日
LW组合 ---> 在日期字段可以组合使用LW,它的意思是当月的最后一个工作日
# ---> 该字符只能在星期字段中使用,表示当月某个工作日: 6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个)
C ---> 该字符只在日期和星期字段中使用,计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期: 5C在日期字段中就相当于日历5日以后的第一天
(4)、其他 Trigger(不同版本有不同扣展)
DateIntervalTrigger ---> 日期间隔触发的Trigger
4、JOB 接口 ---> 调度任务接口
(1)、作用
触发器在被触发后进行的操作,可以指定任意一个类的某个方法。
(2)、JobExecutionContext
JOB上下文,保存着Trigger、 JobDetail 等信息
(3)、定义的方法
public void execute(JobExecutionContext context) throws JobExecutionException;
(4)、JobDetail
a、作用
描述Job的实现类及其它相关的静态信息。
b、原理(看参见 "一、3、(3)")
Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job
c、作用
JobDetail不存储Job的实例,但它允许你定义一个实例,JobDetail 又指向JobDataMap
JobDetail持有Job的详细信息,如它所属的组,名称等信息
(4)、JobDataMap
a、作用
保存着任务实例的对象,并保持着他们状态信息,它是Map接口的实现,即你可以往里面put和get一些你想存储和获取的信息.
b、使用
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
注: 在Quartz 1.5之后,JobDataMap在 Trigger 级也是可用的。
实际使用中trigger级别有时取不到map中的值, 使用getMergedJobDataMap 可以获取到
(5)、StatefulJob
a、作用
代表有状态的任务,该接口是一个没有方法的标签接口,其目的是让Quartz知道任务的类型,以便采用不同的执行方案。
b、与Job的区分
无状态任务在执行时拥有自己的JobDataMap拷贝,对JobDataMap的更改不会影响下次的执行。
有状态任务共享同一个JobDataMap实例,每次任务执行对JobDataMap所做的更改会保存下来,后面的执行可以看到这个更改,也即每次执行任务后都会对后面的执行发生影响。
无状态的Job可以并发执行,而有状态的StatefulJob不能并发执行: 如果前次的StatefulJob还没有执行完毕,下一次的任务将阻塞等待,直到前次任务执行完毕。
(6)、原生Job实现
org.quartz.jobs.FileScanJob ---> 检查某个指定文件是否变化,并在文件被改变时通知到相应监听器的 Job
org.quartz.jobs.FileScanListener ---> 在文件被修改后通知 FileScanJob 的监听器
org.quartz.jobs.NativeJob ---> 用来执行本地程序(如 windows 下 .exe 文件) 的 Job
org.quartz.jobs.NoOpJob ---> 什么也不做。一些用户甚至仅仅用它来导致一个监听器的运行
org.quartz.jobs.ee.mail.SendMailJob ---> 使用 JavaMail API 发送 e-mail 的 Job
org.quartz.jobs.ee.jmx.JMXInvokerJob ---> 调用 JMX bean 上的方法的 Job
org.quartz.jobs.ee.ejb.EJBInvokerJob ---> 用来调用 EJB 上方法的 Job
注:一个job可以对应多个Trgger , 一个Trigger只能对应一个job .