QUARTZ主页
QUARTZ官网-相关文档
QUARTZ官网-配置说明文档
SPRINGBOOT官方文档
Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.
Quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合,也可以单独使用,Quartz可以用来创建简单或复杂的日程序表。
Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。
Quartz有一个小JAVA库发布文件,这个库文件包含了所有Quartz核心功能,这些功能的主要接口是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。
Job:表示一个任务,是定时任务的主体,也是写业务逻辑的地方,如:取消订单、发送邮件等。
JobDetail:表示一个具体的可执行的调度程序,还包含了任务调度的方案和策略,而Job 是该程序所要执行的具体逻辑内容。
Trigger:触发器用来定义任务的执行规则的,如几点执行,几点结束,每隔几分钟执行一次等等。
Scheduler:用来调度任务的,主要用于启动、停止、暂停、恢复等操作,一个Scheduler就是一个调度容器,它可以注册多个 JobDetail 和Trigger,当JobDetail 与 Trigger 组合后,就可以被 Scheduler 容器调度了。
(1)JobDetail:用于定义作业的实例
(2)Trigger:触发器, 执行给定作业计划的组件实例,主要提供了四种类型的触发器:SimpleTrigger、CronTirgger、DateIntervalTrigger和NthIncludedDayTrigger。
(3)Scheduler:与调度程序交互的主要的API,是实际执行调度的控制器
(4)CronScheduleBuilder:用于创建一个Scheduler的生成器
(5)何时触发:通过Trigger来定义, 使用TriggerBuilder进行构建
(6)什么任务:通过JobDetail来定义, 使用JobBuilder进行构建
(7)执行逻辑:通过JOB中的doExecute方法的具体实现, 执行具体的内容
(8)Job接口是真正需要执行的业务逻辑,可以将JobDetail接口理解为是对Job接口的包装,Trigger和Scheduler实际用到的都是JobDetail。
各个核心要素质检的关系:
在 Quartz 中,有两类线程,控制器调度线程和任务执行线程,其中任务执行线程通常使用一个线程池维护一组线程。
控制器调度线程主要有两个: 执行常规调度的线程,和执行 misfired trigger 的线程。常规调度线程轮询存储的所有触发器,如果有需要触发的触发器,即到达了下一次触发的时间,则从任务执行线程池获取一个空闲线程,执行与该触发器关联的任务。Misfire 线程是扫描所有的触发器,查看是否有 misfired trigger,如果存在则根据 misfire 的策略分别处理。
Quartz 中的触发器和任务需要存储下来才能被使用,Quartz 中有两种存储方式:RAMJobStore, JobStoreSupport,其中 RAMJobStore 是将触发器和任务存储在内存中,而 JobStoreSupport 是基于JDCB将触发器和任务存储到数据库中。
在 Quartz 中,JobStoreSupport 使用一个驱动代理来操作触发器和任务的数据存储:StdJDBCDelegate。StdJDBCDelegate 实现了大部分基于标准 JDBC 的功能接口,但是对于各种数据库来说,需要根据其具体实现的特点做某些特殊处理,因此各种数据库需要扩展 StdJDBCDelegate 以实现这些特殊处理,Quartz 已经自带了一些数据库的扩展实现,可以直接使用。
第一种方式(SpringBoot根据自身的版本来选择合适的quartz版本):
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-quartzartifactId>
dependency>
第二种方式(可以灵活选择quartz的版本,当然也可以使用SpringBoot默认的版本):
<dependency>
<groupId>org.quartz-schedulergroupId>
<artifactId>quartzartifactId>
<version>2.3.2version>
<exclusions>
<exclusion>
<groupId>com.mchangegroupId>
<artifactId>c3p0artifactId>
exclusion>
<exclusion>
<groupId>com.zaxxergroupId>
<artifactId>*artifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.quartz-schedulergroupId>
<artifactId>quartz-jobsartifactId>
<version>2.3.2version>
dependency>
(1)org.quartz.jobStore.driverDelegateClass,用于指定任务持久化的数据库的驱动,可选的值如下:
org.quartz.impl.jdbcjobstore.StdJDBCDelegate(用于完全符合JDBC的驱动程序)
org.quartz.impl.jdbcjobstore.MSSQLDelegate(对于Microsoft SQL Server和Sybase)
org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.impl.jdbcjobstore.WebLogicDelegate(对于WebLogic驱动程序)
org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.impl.jdbcjobstore.oracle.WebLogicOracleDelegate(对于Weblogic中使用的Oracle驱动程序)
org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate(对于在Weblogic中使用的Oracle驱动程序)
org.quartz.impl.jdbcjobstore.CloudscapeDelegate
org.quartz.impl.jdbcjobstore.DB2v6Delegate
org.quartz.impl.jdbcjobstore.DB2v7Delegate
org.quartz.impl.jdbcjobstore.DB2v8Delegate
org.quartz.impl.jdbcjobstore.HSQLDBDelegate
org.quartz.impl.jdbcjobstore.PointbaseDelegate
org.quartz.impl.jdbcjobstore.SybaseDelegate
以前有12张表,现在只有11张表,现在没有存储触发器监听器的表(qrtz_trigger_listeners),增加了qrtz_simprop_triggers 表:
序号 | 表名 | 描述 |
---|---|---|
1 | qrtz_blob_triggers | 以BLOB类型存储的触发器 |
2 | qrtz_calendars | 存放日历信息,QUARTZ可以配置一个日历来指定一个时间范围 |
3 | qrtz_cron_triggers | 存放CRON类型的触发器 |
4 | qrtz_fired_triggers | 存放已触发的触发器 |
5 | qrtz_job_details | 存放jobDetail的信息 |
6 | qrtz_locks | 存放程序的悲观锁的信息(假如使用了悲观锁) |
7 | qrtz_paused_trigger_graps | 存放暂停掉的触发器 |
8 | qrtz_scheduler_state | 存放调度器状态 |
9 | qrtz_simple_triggers | 存放简单的触发器 |
10 | qrtz_simprop_triggers | 存放简单触发器的详细信息 |
11 | qrtz_triggers | 存放触发器的基本信息 |
-- ----------------------------
-- ①. JOB_DETAILS详细信息表
-- ----------------------------
drop table if exists QRTZ_JOB_DETAILS;
create table QRTZ_JOB_DETAILS (
sched_name varchar(120) not null,
job_name varchar(200) not null,
job_group varchar(200) not null,
description varchar(250) null,
job_class_name varchar(250) not null,
is_durable varchar(1) not null,
is_nonconcurrent varchar(1) not null,
is_update_data varchar(1) not null,
requests_recovery varchar(1) not null,
job_data blob null,
primary key (sched_name,job_name,job_group)
) engine=innodb;
-- ----------------------------
-- ②. 触发器详细信息表, 存储已配置的Trigger的信息
-- ----------------------------
drop table if exists QRTZ_TRIGGERS;
create table QRTZ_TRIGGERS (
sched_name varchar(120) not null,
trigger_name varchar(200) not null,
trigger_group varchar(200) not null,
job_name varchar(200) not null,
job_group varchar(200) not null,
description varchar(250) null,
next_fire_time bigint(13) null,
prev_fire_time bigint(13) null,
priority integer null,
trigger_state varchar(16) not null,
trigger_type varchar(8) not null,
start_time bigint(13) not null,
end_time bigint(13) null,
calendar_name varchar(200) null,
misfire_instr smallint(2) null,
job_data blob null,
primary key (sched_name,trigger_name,trigger_group),
foreign key (sched_name,job_name,job_group) references QRTZ_JOB_DETAILS(sched_name,job_name,job_group)
) engine=innodb;
-- ----------------------------
-- ③. 简单触发器详细信息表, 与触发器表进行关联. 存储的信息包括重复次数、间隔、以及已触发的次数
-- ----------------------------
drop table if exists QRTZ_SIMPLE_TRIGGERS;
create table QRTZ_SIMPLE_TRIGGERS (
sched_name varchar(120) not null,
trigger_name varchar(200) not null,
trigger_group varchar(200) not null,
repeat_count bigint(7) not null,
repeat_interval bigint(12) not null,
times_triggered bigint(10) not null,
primary key (sched_name,trigger_name,trigger_group),
foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
) engine=innodb;
-- ----------------------------
-- ④. CRON触发器详细信息表, 与触发器表进行关联. 存储的信息包括CRON表达式和时区信息
-- ----------------------------
drop table if exists QRTZ_CRON_TRIGGERS;
create table QRTZ_CRON_TRIGGERS (
sched_name varchar(120) not null,
trigger_name varchar(200) not null,
trigger_group varchar(200) not null,
cron_expression varchar(200) not null,
time_zone_id varchar(80),
primary key (sched_name,trigger_name,trigger_group),
foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
) engine=innodb;
-- ----------------------------
-- ⑤. 自定义触发器详细信息表, Trigger 作为 Blob 类型存储(使用用JDBC创建自定义的TRIGGER类型, JobStore 并不知道如何存储实例的时候)
-- ----------------------------
drop table if exists QRTZ_BLOB_TRIGGERS;
create table QRTZ_BLOB_TRIGGERS (
sched_name varchar(120) not null,
trigger_name varchar(200) not null,
trigger_group varchar(200) not null,
blob_data blob null,
primary key (sched_name,trigger_name,trigger_group),
foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
) engine=innodb;
-- ----------------------------
-- ⑥. 日历信息表, 使用BLOB类型存储存放日历信息, QUARTZ可配置一个日历来指定一个时间范围
-- ----------------------------
drop table if exists QRTZ_CALENDARS;
create table QRTZ_CALENDARS (
sched_name varchar(120) not null,
calendar_name varchar(200) not null,
calendar blob not null,
primary key (sched_name,calendar_name)
) engine=innodb;
-- ----------------------------
-- ⑦. 存储已暂停的触发器组的信息
-- ----------------------------
drop table if exists QRTZ_PAUSED_TRIGGER_GRPS;
create table QRTZ_PAUSED_TRIGGER_GRPS (
sched_name varchar(120) not null,
trigger_group varchar(200) not null,
primary key (sched_name,trigger_group)
) engine=innodb;
-- ----------------------------
-- ⑧. 存储与已触发的触发器相关的状态信息, 以及相关联的JOB的执行信息
-- ----------------------------
drop table if exists QRTZ_FIRED_TRIGGERS;
create table QRTZ_FIRED_TRIGGERS (
sched_name varchar(120) not null,
entry_id varchar(95) not null,
trigger_name varchar(200) not null,
trigger_group varchar(200) not null,
instance_name varchar(200) not null,
fired_time bigint(13) not null,
sched_time bigint(13) not null,
priority integer not null,
state varchar(16) not null,
job_name varchar(200) null,
job_group varchar(200) null,
is_nonconcurrent varchar(1) null,
requests_recovery varchar(1) null,
primary key (sched_name,entry_id)
) engine=innodb;
-- ----------------------------
-- ⑨. 存储少量的有关调度器(SCHEDULER)的状态信息, 假如是用于集群中, 可以看到其他的SCHEDULER实例
-- ----------------------------
drop table if exists QRTZ_SCHEDULER_STATE;
create table QRTZ_SCHEDULER_STATE (
sched_name varchar(120) not null,
instance_name varchar(200) not null,
last_checkin_time bigint(13) not null,
checkin_interval bigint(13) not null,
primary key (sched_name,instance_name)
) engine=innodb;
-- ----------------------------
-- ⑩. 存储程序的悲观锁的信息(假如使用了悲观锁)
-- ----------------------------
drop table if exists QRTZ_LOCKS;
create table QRTZ_LOCKS (
sched_name varchar(120) not null,
lock_name varchar(40) not null,
primary key (sched_name,lock_name)
) engine=innodb;
-- ----------------------------
-- 11. 简单触发器详细信息表, 与触发器表进行关联
-- ----------------------------
drop table if exists QRTZ_SIMPROP_TRIGGERS;
create table QRTZ_SIMPROP_TRIGGERS (
sched_name varchar(120) not null,
trigger_name varchar(200) not null,
trigger_group varchar(200) not null,
str_prop_1 varchar(512) null,
str_prop_2 varchar(512) null,
str_prop_3 varchar(512) null,
int_prop_1 int null,
int_prop_2 int null,
long_prop_1 bigint null,
long_prop_2 bigint null,
dec_prop_1 numeric(13,4) null,
dec_prop_2 numeric(13,4) null,
bool_prop_1 varchar(1) null,
bool_prop_2 varchar(1) null,
primary key (sched_name,trigger_name,trigger_group),
foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)
) engine=innodb;
commit;
SpringBoot - 集成Quartz框架之CRON表达式
SpringBoot - 集成Quartz框架之Quartz简介(一)
SpringBoot - 集成Quartz框架之常用配置(二)
SpringBoot - 集成Quartz框架之具体步骤(三)
SpringBoot - 集成Quartz框架之独立数据源(四)
SpringBoot - 集成Quartz框架之常见问题(五)
SpringBoot - 集成Quartz框架之@DisallowConcurrentExecution注解详解(六)