1.在数据源数据库中执行下载的quartz的sql语句(创建11张表),其中表头qrtz_可以在在配置文件中更改,对应表创建时更改org.quartz.jobStore.tablePrefix=qrtz_

1.1.qrtz_job_details 存储jobDetails信息

CREATE TABLE QRTZ_JOB_DETAILS
(
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL, -- job的名字,该名字用户自定义
JOB_GROUP VARCHAR(200) NOT NULL, -- job的所属组的名字,该名字用户自定义
DESCRIPTION VARCHAR(250) NULL, -- 自定义描述
JOB_CLASS_NAME VARCHAR(250) NOT NULL, -- 集群中个note job实现类的完全包名,quartz就是根据这个路径到classpath找到该job类
IS_DURABLE VARCHAR(1) NOT NULL, -- 是否持久化,把该属性设置为1,quartz会把job持久化到数据库中
IS_NONCONCURRENT VARCHAR(1) NOT NULL, --
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL, -- 一个blob字段,存放持久化job的数据
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)-- 主键
);

1.2.qrtz_triggers 保存trigger信息

CREATE TABLE QRTZ_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL, -- trigger的名字
TRIGGER_GROUP VARCHAR(200) NOT NULL, -- trigger所属组的名字
JOB_NAME VARCHAR(200) NOT NULL, -- job的名字
JOB_GROUP VARCHAR(200) NOT NULL, -- job的所属组的名字
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, -- 自定义calendar名称
MISFIRE_INSTR SMALLINT(2) NULL, -- Misfire(错失触发)
JOB_DATA BLOB NULL, -- job传递的数据,JobDataMap序列号后的二进制数据
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), -- 主键
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) -- 外键约束QRTZ_JOB_DETAILS
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
);

1.3.qrtz_simple_triggers (存储SimpleTrigger)

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)
);

1.4.qrtz_cron_triggers (存储CronTrigger,这也是我们使用最多的触发器)

CREATE TABLE QRTZ_CRON_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL, -- 调度器名称
TRIGGER_NAME VARCHAR(200) NOT NULL, -- trigger的名字
TRIGGER_GROUP VARCHAR(200) NOT NULL, -- trigger所属组的名字
CRON_EXPRESSION VARCHAR(200) NOT NULL, -- cron表达式
TIME_ZONE_ID VARCHAR(80), -- 时区
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), -- 主键
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) -- 外键约束QRTZ_TRIGGERS
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

1.5.qrtz_simprop_triggers(存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器)

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)
);

1.6.自定义的triggers使用blog类型进行存储,非自定义的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)
);

1.7.Quartz为我们提供了日历的功能,可以自己定义一个时间段,可以控制触发器在这个时间段内触发或者不触发

CREATE TABLE QRTZ_CALENDARS
(
SCHED_NAME VARCHAR(120) NOT NULL, -- 调度器名称
CALENDAR_NAME VARCHAR(200) NOT NULL, -- 自定义calendar名称
CALENDAR BLOB NOT NULL, -- 对象
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
);

1.8.存放暂停掉的触发器,测试手动暂停firstCronTrigger

CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);

1.9.存储已经触发的trigger相关信息,trigger随着时间的推移状态发生变化,直到最后trigger执行完成,从表中被删除

CREATE TABLE QRTZ_FIRED_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL, -- 调度器名称
ENTRY_ID VARCHAR(95) NOT NULL, -- 入口id
TRIGGER_NAME VARCHAR(200) NOT NULL, -- trigger的名字
TRIGGER_GROUP VARCHAR(200) NOT NULL, -- trigger所属组的名字
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的名字
JOB_GROUP VARCHAR(200) NULL, -- job的所属组的名字
IS_NONCONCURRENT VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID)
);

1.10.存储所有节点的scheduler,会定期检查scheduler是否失效

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, -- 检查间隔,配置中设置org.quartz.jobStore.clusterCheckinInterval=20000
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
);

1.11.qrtz_locks Quartz提供的锁表,为多个节点调度提供分布式锁,实现分布式调度,默认有2个锁:

STATE_ACCESS主要用在scheduler定期检查是否失效的时候,保证只有一个节点去处理已经失效的scheduler;
TRIGGER_ACCESS主要用在TRIGGER被调度的时候,保证只有一个节点去执行调度;

CREATE TABLE QRTZ_LOCKS
(
SCHED_NAME VARCHAR(120) NOT NULL, -- 调度器名称
LOCK_NAME VARCHAR(40) NOT NULL, -- 锁名
PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);

2.trigger的状态变化,共有九种状态

WAITING 创建任务触发器默认状态
ACQUIRED 当到达触发时间时,获得状态
EXECUTING 运行中,firedTrigger表中
COMPLETE 完成状态,任务结束
BLOCKED 阻塞状态
ERROR 错误状态
PAUSED 暂停状态
PAUSED_BLOCKED 暂停阻塞状态,非并发下
DELETED 删除状态

3.cron表达式

以下为CronExpression javadoc 所示
Cron表达式组成的6所必需的字段和一个可选的字段由空格隔开。

"{Seconds} {Minutes} {Hours} {Day-of-month} {Month} {Day-of-Week} {Year(可选)}"

字段分别描述如下:

Field Name   Allowed Values   Allowed Special Characters
Seconds   0-59   , - * /
Minutes   0-59   , - * /
Hours   0-23   , - * /
Day-of-month   1-31   , - * ? / L W
Month   0-11 or JAN-DEC   , - * /
Day-of-Week   1-7 or SUN-SAT   , - * ? / L #
Year (Optional)   empty, 1970-2199   , - * /

' * ' 字符用于任意值。例如,“*”在分钟字段中意味着“每一分钟”触发。

' ? ' Day-of-month和Day-of-Week字段允许使用该字符,它用于指定“没有特定的值”触发。

' - ' 字符用于指定范围例如小时领域的“10-12”意味着“10点、11点和12点”触发。

' , ' 字符用于指定特定的值。例如“MON, WED, FRI”意味着“星期一,星期三,星期五”触发。

' / ' 字符用于指定增量。例如秒领域的“0/15”意味着“从0秒开始,15秒,30秒,和45秒”触发。

' L ' Day-of-month和Day-of-Week字段允许使用该字符。"last"的缩写,但它的两个领域有不同的含义。例如,日期字段的值“L”意味着“本月的最后一天”,1月的话为31日,闰年2月的话为28日。
如果单独使用用于Day-of-Week,指数字7或者SAT即周六。若在一个数字后面如"* * * ? * 6L" 指最后一个星期五。
还可以从这个月的最后一天指定一个偏移量,如"* * * L-3 * ?" 如本月最后一天是30日,则提前三天即27日。使用“L”选项时,重要的是不要指定列表,或值的范围,你会得到混乱的结果。

' W ' Day-of-month字段允许使用该字符。这个是用于指定工作日(Monday-Friday)最近的一天。
例子,如果你要“15w”指定为Day-of-Week字段的值,意思是:“到本月15日最近的工作日”。
如果15日是周六,触发器将在周五触发即14日。如果15日是周日,周一触发器将触发即16日。
如果15日是星期二,那么它将在周二触发即15日。然而如果指定“1w”作为Day-of-month值,1日是周六,周一触发器将火第三,因为它不会跨越一个月。'W'字符只能指定一天的日期,不是一个范围或列表。

‘L’和‘W’字符也可以组合为Day-of-month表达式产生“LW”,这意味着“本月最后一个工作日”。
' # ' Day-of-Week字段允许使用该字符。这个字符用于特殊的日期。例如,Day-of-Week属性使用“6#3”指的是这个月的第三个周五(6=周五和“#3”=第三个)。其他的例子:“2#1”=本月第一个星期一、“4#5”=第五个星期三。
请注意,如果您指定“#5”和没有给定的一月中的第5个周几,然后没有触发。如果使用“#”字符,只能有一个表达式在Day-of-Week字段(“3#1,6#3”是无效的,因为有两个表达式)。

' C ' Day-of-month和Day-of-Week字段允许使用该字符。"calendar"的缩写。计算相关的日历。在Day-of-month字段“5c”指下个5号触发,当前时间超过5号则下个月5号触发。“31C” 下一个31号触发
Day-of-Week字段“1c”意味着“下一个星期天”。

字符名称不区分大小写。

不能同时包含Day-of-month和Day-of-Week字段,指定其中一个时,需要使用?来指定另外一个,如上述例子中要不在Day-of-month上使用?,要不在Day-of-Week上使用?

年(可选): 最大值为当前年+100但是也不能超过2199:MAX_YEAR = Calendar.getInstance().get(Calendar.YEAR) + 100;

CronExpression 中所示

月英文简称(get到后加1,对应月的整数为1-12):
monthMap.put("JAN", 0);
monthMap.put("FEB", 1);
monthMap.put("MAR", 2);
monthMap.put("APR", 3);
monthMap.put("MAY", 4);
monthMap.put("JUN", 5);
monthMap.put("JUL", 6);
monthMap.put("AUG", 7);
monthMap.put("SEP", 8);
monthMap.put("OCT", 9);
monthMap.put("NOV", 10);
monthMap.put("DEC", 11);
星期英文简称:
dayMap.put("SUN", 1);
dayMap.put("MON", 2);
dayMap.put("TUE", 3);
dayMap.put("WED", 4);
dayMap.put("THU", 5);
dayMap.put("FRI", 6);
dayMap.put("SAT", 7);

quartz的使用(三)的更多相关文章

  1. 作业调度框架 Quartz 学习笔记(三) -- Cron表达式 (转载)

    前面两篇说的是简单的触发器(SimpleTrigger) , SimpleTrigger 只能处理简单的事件出发,如果想灵活的进行任务的触发,就要请出 CronTrigger 这个重要人物了. Cro ...

  2. 配置quartz数据源的三种方式

    如果是使用了JDBC JobStore或JobStoreCMT获得持久的Job时,就要配置相关的数据源了. 方式一:使用quartz.properties文件,这时只需要在property文件中增加如 ...

  3. Quartz总结(三):动态修改定时器一

    package com.mc.bsframe.job; import org.quartz.Scheduler; import org.quartz.SchedulerException; impor ...

  4. ABP Quartz 作业调度第三篇

    1.第一步安装Abp.Quartz ,把他安装到核心层 核心模块添加对quarz的依赖, 领域层创建firstjob类 public class FirstJob : JobBase, ITransi ...

  5. 任务调度 Quartz 学习(三) CronTrigger 表达式

    CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表. CronT ...

  6. 关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能

    Quartz.NET是一个非常强大的作业调度框架,适用于各种定时执行的业务处理等,类似于WINDOWS自带的任务计划程序,其中运用Cron表达式来实现各种定时触发条件是我认为最为惊喜的地方. Quar ...

  7. Quartz2D 编程指南(三)渐变、透明层 、数据管理

    概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 渐变 简介 渐变是从一个颜色到另外 ...

  8. Quartz集群

    为什么选择Quartz: 1)资历够老,创立于1998年,比struts1还早,但是一直在更新(27 April 2012: Quartz 2.1.5 Released),文档齐全. 2)完全由Jav ...

  9. Quartz定时任务学习(一)简单任务

    学习quartz首先了解三个概念: 调度器:负责调度作业和触发器: 触发器:设置作业执行的时间.参数.条件等:(简单触发器和Cron触发器) 作业:定时任务内容,被执行的程序: 下载必要的jar包,直 ...

随机推荐

  1. OpenGL学习——搭建OpenGL运行环境——生成一个空白视口——基于GLFW&GLEW

    最近学习OpenGL,读OpenGL宝典一头蒙,各种gl函数不知所云.逐决定先搭OpenGL运行环境,详细如下. 1.首先OpenGL是什么?是一个标准规范,是一个巨大的状态机,并无具体实现,大多数实 ...

  2. JS对象 window对象 屏幕可用高和宽度 1. screen.availWidth 属性返回访问者屏幕的宽度,以像素计,减去界面特性,比如任务栏。 2. screen.availHeight 属

    屏幕可用高和宽度 1. screen.availWidth 属性返回访问者屏幕的宽度,以像素计,减去界面特性,比如任务栏. 2. screen.availHeight 属性返回访问者屏幕的高度,以像素 ...

  3. element-ui中table渲染的快速用法

    element-ui中对table数据的渲染有一些模板式的操作,基本按照模板渲染数据即可 基本模板样式如下 <el-table :data="studentData.rows" ...

  4. mutable and immutable

    employees = ['Corey', 'John', 'Rick', 'Steve', 'Carl', 'Adam'] output = '<ul>\n' for employee ...

  5. Vue学习笔记【2】——Vue指令之 - v-cloak、v-text和v-html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. d3js 折线图+柱图

    <!DOCTYPE html> <html> <body> <div id="vis"><svg></svg> ...

  7. putty字体和颜色修改

    来源:https://www.igvita.com/2008/04/14/custom-putty-color-themes/ 网站上有putty的注册表,可以修改putty显示的配色方案. 非常棒!

  8. Android中的Service的使用详解

    按运行地点分类: 类别 区别 优点 缺点 应用 本地服务(Local) 该服务依附在主进程上, 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不 ...

  9. DGIM算法

    /***************************************************** copyright (C), 2014-2015, Lighting Studio. Co ...

  10. 【SQL】事务回滚

    事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服 ...