创作背景
在常规的业务中,定时任务的应用还是非常广泛的,例如:定时发送通知、定时推送微信公众号消息、定时去清理一些没用的垃圾文件、定时去做某些数据量比较大的统计等等。都是使用到定时任务,所以熟练掌握一门定时任务还是很有必要的。本文会详细说明从无到配置好quartz的整个流程。
quartz简介
Quartz是OpenSymphony开源组织在Job scheduling领域的一个开源项目,不同于Spring 自带的Scheduled,Quartz可以实现集群部署和分布式调度任务,从而避免在集群环境下,会导致任务被重复调度的问题,在多服务节点下,每一个节点上的quartz都是一个独立的应用。通过数据库锁的方式来保证每个节点的任务只有一个运行。
quartz主体结构
Job:表示一个要执行的任务
Jobdetail:表示一个具体的可执行的调度程序,包含了要执行任务的信息
Trigger:触发器,决定任务什么时候被调用
Scheduler:调度器,将Jobdetail跟Trigger绑定,定时的去执行Jobdetail中的任务信息
quartz实践
1.创建quartz相关的表
项目中引入quartz首先要在对应服务的数据库里面创建对应的表,数据库表结构官网已经提供,直接访问Quartz对应的官方网站,找到对应的版本,将建表脚本下载,然后在数据库运行即可,由于我使用的数据库是mysql-5.7,因此我选择的是tables_mysql_innodb.sql脚本,具体脚本内容如下:
CREATE TABLE IF NOT EXISTS my_test.qrtz_job_details
(
sched_name VARCHAR(120) NOT NULL,
job_name VARCHAR(200) NOT NULL,
job_group VARCHAR(200) NOT NULL,
description VARCHAR(250) DEFAULT 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,
PRIMARY KEY (sched_name, job_name, job_group) USING BTREE,
KEY idx_qrtz_j_req_recovery (sched_name, requests_recovery) USING BTREE,
KEY idx_qrtz_j_grp (sched_name, job_group) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE IF NOT EXISTS my_test.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) DEFAULT NULL,
next_fire_time BIGINT(20) DEFAULT NULL,
prev_fire_time BIGINT(20) DEFAULT NULL,
priority INT(11) DEFAULT NULL,
trigger_state VARCHAR(16) NOT NULL,
trigger_type VARCHAR(8) NOT NULL,
start_time BIGINT(20) NOT NULL,
end_time BIGINT(20) DEFAULT NULL,
calendar_name VARCHAR(200) DEFAULT NULL,
misfire_instr SMALLINT(6) DEFAULT NULL,
job_data BLOB,
PRIMARY KEY (sched_name, trigger_name, trigger_group) USING BTREE,
KEY idx_qrtz_t_g (sched_name, trigger_group) USING BTREE,
KEY idx_qrtz_t_n_state (sched_name, trigger_name, trigger_group, trigger_state) USING BTREE,
KEY idx_qrtz_t_nft_st (sched_name, trigger_state, next_fire_time) USING BTREE,
KEY idx_qrtz_t_nft_st_misfire (sched_name, misfire_instr, next_fire_time, trigger_state) USING BTREE,
KEY idx_qrtz_t_c (sched_name, calendar_name) USING BTREE,
KEY idx_qrtz_t_next_fire_time (sched_name, next_fire_time) USING BTREE,
KEY idx_qrtz_t_n_g_state (sched_name, trigger_group, trigger_state) USING BTREE,
KEY idx_qrtz_t_nft_misfire (sched_name, misfire_instr, next_fire_time) USING BTREE,
KEY idx_qrtz_t_jg (sched_name, job_group) USING BTREE,
KEY idx_qrtz_t_nft_st_misfire_grp (sched_name, misfire_instr, next_fire_time, trigger_group, trigger_state) USING BTREE,
KEY idx_qrtz_t_state (sched_name, trigger_state) USING BTREE,
KEY idx_qrtz_t_j (sched_name, job_name, job_group) USING BTREE,
CONSTRAINT qrtz_triggers_ibfk_1 FOREIGN KEY (sched_name, job_name, job_group) REFERENCES qrtz_job_details (sched_name, job_name, job_group) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE IF NOT EXISTS my_test.qrtz_blob_triggers
(
sched_name VARCHAR(120) NOT NULL,
trigger_name VARCHAR(200) NOT NULL,
trigger_group VARCHAR(200) NOT NULL,
blob_data BLOB,
PRIMARY KEY (sched_name, trigger_name, trigger_group) USING BTREE,
KEY sched_name (sched_name,trigger_name,trigger_group) USING BTREE,
CONSTRAINT qrtz_blob_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE IF NOT EXISTS my_test.qrtz_calendars
(
sched_name VARCHAR(120) NOT NULL,
calendar_name VARCHAR(200) NOT NULL,
calendar BLOB NOT NULL,
PRIMARY KEY (sched_name, calendar_name) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE IF NOT EXISTS my_test.qrtz_cron_triggers
(
sched_name VARCHAR(120) NOT NULL,
trigger_name VARCHAR(200) NOT NULL,
trigger_group VARCHAR(200) NOT NULL,
cron_expression VARCHAR(120) NOT NULL,
time_zone_id VARCHAR(80) DEFAULT NULL,
PRIMARY KEY (sched_name, trigger_name, trigger_group) USING BTREE,
CONSTRAINT qrtz_cron_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE IF NOT EXISTS my_test.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(20) NOT NULL