quartz的使用(三)

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

转载于:https://www.cnblogs.com/lantuanqing/p/11010103.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值