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. Linux 登录、注销与关机

    Linux 登录.注销与关机 这里主要学习的是命令行环境下的相关操作. 一.登录 Linux 默认的情况下会提供六个终端来让用户登录,切换的方式为使用:[Ctrl + Alt + F1 ~ F6]的组 ...

  2. 学习记录:@Transactional 事务不生效

    测试时使用spring boot2.2.0,在主类中调用,@Transactional 不起作用,原代码如下: @SpringBootApplication @Slf4j @Component pub ...

  3. 70. SequenceInputStream(文件合并)

    缓冲输入字节流:----------------------| InputStream 输入字节流的基类----------------| FileInputStream  读取文件的输入字节流--- ...

  4. C之输入输出函数(1) -- fgets()

    https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/rtref/fgets.htm #include <stdio.h> ...

  5. Linux环境下安装PHP的memced扩展

    先下载libmemcached: wget  https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.t ...

  6. [NOIP模拟16]题解

    A.Blue 出题人大概已经去为国家处理积压子弹了? 贪心,让每一只青蛙(我怂行吧)都尽量往远跳,能到达的最远的被踩了就跳次远的,以此类推.可以维护一个单调队列,表示每只青蛙的位置(开始都是0).然后 ...

  7. C++语言编程基础

    C++程序设计语言可以看作C语言的改进和升级,不仅完全兼容了C语言的语法和函数库,还引入了面向对象.运算符重载.多态性.数据流和模板等最新的编程思想.极大地保证了源代码的生产率.质量和可重用性.GNU ...

  8. P1435 回文字串

    P1435 回文字串 题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最 ...

  9. 转-C++之虚函数不能定义成内联函数的原因

    转自:https://blog.csdn.net/flydreamforever/article/details/61429140 在C++中,inline关键字和virtual关键字分别用来定义c+ ...

  10. 框架-.NET:Spring.Net

    ylbtech-框架-Spring.Net:Spring.Net Spring.NET为建立企业级应用提供了一套轻量级的解决方案.通过Spring.NET,我们可以用统一且透明的方式来配置应用程序.S ...