Commit dadb66c8e9f8126bae13f9d6d0a4a578379a4d52

Authored by YunaiV
1 parent c807de1f

初始化 Quartz 的整体代码

sql/quartz.sql
1 --- ----------------------------  
2 --- 1、存储每一个已配置的 jobDetail 的详细信息  
3 --- ----------------------------  
4 -drop table if exists QRTZ_JOB_DETAILS;  
5 -create table QRTZ_JOB_DETAILS (  
6 - sched_name varchar(120) not null,  
7 - job_name varchar(200) not null,  
8 - job_group varchar(200) not null,  
9 - description varchar(250) null,  
10 - job_class_name varchar(250) not null,  
11 - is_durable varchar(1) not null,  
12 - is_nonconcurrent varchar(1) not null,  
13 - is_update_data varchar(1) not null,  
14 - requests_recovery varchar(1) not null,  
15 - job_data blob null,  
16 - primary key (sched_name,job_name,job_group)  
17 -) engine=innodb;  
18 -  
19 --- ----------------------------  
20 --- 2、 存储已配置的 Trigger 的信息  
21 --- ----------------------------  
22 -drop table if exists QRTZ_TRIGGERS;  
23 -create table QRTZ_TRIGGERS (  
24 - sched_name varchar(120) not null,  
25 - trigger_name varchar(200) not null,  
26 - trigger_group varchar(200) not null,  
27 - job_name varchar(200) not null,  
28 - job_group varchar(200) not null,  
29 - description varchar(250) null,  
30 - next_fire_time bigint(13) null,  
31 - prev_fire_time bigint(13) null,  
32 - priority integer null,  
33 - trigger_state varchar(16) not null,  
34 - trigger_type varchar(8) not null,  
35 - start_time bigint(13) not null,  
36 - end_time bigint(13) null,  
37 - calendar_name varchar(200) null,  
38 - misfire_instr smallint(2) null,  
39 - job_data blob null,  
40 - primary key (sched_name,trigger_name,trigger_group),  
41 - foreign key (sched_name,job_name,job_group) references QRTZ_JOB_DETAILS(sched_name,job_name,job_group)  
42 -) engine=innodb;  
43 -  
44 --- ----------------------------  
45 --- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数  
46 --- ----------------------------  
47 -drop table if exists QRTZ_SIMPLE_TRIGGERS;  
48 -create table QRTZ_SIMPLE_TRIGGERS (  
49 - sched_name varchar(120) not null,  
50 - trigger_name varchar(200) not null,  
51 - trigger_group varchar(200) not null,  
52 - repeat_count bigint(7) not null,  
53 - repeat_interval bigint(12) not null,  
54 - times_triggered bigint(10) not null,  
55 - primary key (sched_name,trigger_name,trigger_group),  
56 - foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)  
57 -) engine=innodb;  
58 -  
59 --- ----------------------------  
60 --- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息  
61 --- ----------------------------  
62 -drop table if exists QRTZ_CRON_TRIGGERS;  
63 -create table QRTZ_CRON_TRIGGERS (  
64 - sched_name varchar(120) not null,  
65 - trigger_name varchar(200) not null,  
66 - trigger_group varchar(200) not null,  
67 - cron_expression varchar(200) not null,  
68 - time_zone_id varchar(80),  
69 - primary key (sched_name,trigger_name,trigger_group),  
70 - foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)  
71 -) engine=innodb;  
72 -  
73 --- ----------------------------  
74 --- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)  
75 --- ----------------------------  
76 -drop table if exists QRTZ_BLOB_TRIGGERS;  
77 -create table QRTZ_BLOB_TRIGGERS (  
78 - sched_name varchar(120) not null,  
79 - trigger_name varchar(200) not null,  
80 - trigger_group varchar(200) not null,  
81 - blob_data blob null,  
82 - primary key (sched_name,trigger_name,trigger_group),  
83 - foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)  
84 -) engine=innodb;  
85 -  
86 --- ----------------------------  
87 --- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围  
88 --- ----------------------------  
89 -drop table if exists QRTZ_CALENDARS;  
90 -create table QRTZ_CALENDARS (  
91 - sched_name varchar(120) not null,  
92 - calendar_name varchar(200) not null,  
93 - calendar blob not null,  
94 - primary key (sched_name,calendar_name)  
95 -) engine=innodb;  
96 -  
97 --- ----------------------------  
98 --- 7、 存储已暂停的 Trigger 组的信息  
99 --- ----------------------------  
100 -drop table if exists QRTZ_PAUSED_TRIGGER_GRPS;  
101 -create table QRTZ_PAUSED_TRIGGER_GRPS (  
102 - sched_name varchar(120) not null,  
103 - trigger_group varchar(200) not null,  
104 - primary key (sched_name,trigger_group)  
105 -) engine=innodb;  
106 -  
107 --- ----------------------------  
108 --- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息  
109 --- ----------------------------  
110 -drop table if exists QRTZ_FIRED_TRIGGERS;  
111 -create table QRTZ_FIRED_TRIGGERS (  
112 - sched_name varchar(120) not null,  
113 - entry_id varchar(95) not null,  
114 - trigger_name varchar(200) not null,  
115 - trigger_group varchar(200) not null,  
116 - instance_name varchar(200) not null,  
117 - fired_time bigint(13) not null,  
118 - sched_time bigint(13) not null,  
119 - priority integer not null,  
120 - state varchar(16) not null,  
121 - job_name varchar(200) null,  
122 - job_group varchar(200) null,  
123 - is_nonconcurrent varchar(1) null,  
124 - requests_recovery varchar(1) null,  
125 - primary key (sched_name,entry_id)  
126 -) engine=innodb;  
127 -  
128 --- ----------------------------  
129 --- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例  
130 --- ----------------------------  
131 -drop table if exists QRTZ_SCHEDULER_STATE;  
132 -create table QRTZ_SCHEDULER_STATE (  
133 - sched_name varchar(120) not null,  
134 - instance_name varchar(200) not null,  
135 - last_checkin_time bigint(13) not null,  
136 - checkin_interval bigint(13) not null,  
137 - primary key (sched_name,instance_name)  
138 -) engine=innodb;  
139 -  
140 --- ----------------------------  
141 --- 10、 存储程序的悲观锁的信息(假如使用了悲观锁)  
142 --- ----------------------------  
143 -drop table if exists QRTZ_LOCKS;  
144 -create table QRTZ_LOCKS (  
145 - sched_name varchar(120) not null,  
146 - lock_name varchar(40) not null,  
147 - primary key (sched_name,lock_name)  
148 -) engine=innodb;  
149 -  
150 -drop table if exists QRTZ_SIMPROP_TRIGGERS;  
151 -create table QRTZ_SIMPROP_TRIGGERS (  
152 - sched_name varchar(120) not null,  
153 - trigger_name varchar(200) not null,  
154 - trigger_group varchar(200) not null,  
155 - str_prop_1 varchar(512) null,  
156 - str_prop_2 varchar(512) null,  
157 - str_prop_3 varchar(512) null,  
158 - int_prop_1 int null,  
159 - int_prop_2 int null,  
160 - long_prop_1 bigint null,  
161 - long_prop_2 bigint null,  
162 - dec_prop_1 numeric(13,4) null,  
163 - dec_prop_2 numeric(13,4) null,  
164 - bool_prop_1 varchar(1) null,  
165 - bool_prop_2 varchar(1) null,  
166 - primary key (sched_name,trigger_name,trigger_group),  
167 - foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group)  
168 -) engine=innodb;  
169 -  
170 -commit;  
171 \ No newline at end of file 1 \ No newline at end of file
  2 +
  3 +#
  4 +# In your Quartz properties file, you'll need to set
  5 +# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  6 +#
  7 +#
  8 +# By: Ron Cordell - roncordell
  9 +# I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.
  10 +
  11 +DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
  12 +DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
  13 +DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
  14 +DROP TABLE IF EXISTS QRTZ_LOCKS;
  15 +DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
  16 +DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
  17 +DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
  18 +DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
  19 +DROP TABLE IF EXISTS QRTZ_TRIGGERS;
  20 +DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
  21 +DROP TABLE IF EXISTS QRTZ_CALENDARS;
  22 +
  23 +CREATE TABLE QRTZ_JOB_DETAILS(
  24 +SCHED_NAME VARCHAR(120) NOT NULL,
  25 +JOB_NAME VARCHAR(190) NOT NULL,
  26 +JOB_GROUP VARCHAR(190) NOT NULL,
  27 +DESCRIPTION VARCHAR(250) NULL,
  28 +JOB_CLASS_NAME VARCHAR(250) NOT NULL,
  29 +IS_DURABLE VARCHAR(1) NOT NULL,
  30 +IS_NONCONCURRENT VARCHAR(1) NOT NULL,
  31 +IS_UPDATE_DATA VARCHAR(1) NOT NULL,
  32 +REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
  33 +JOB_DATA BLOB NULL,
  34 +PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
  35 +ENGINE=InnoDB;
  36 +
  37 +CREATE TABLE QRTZ_TRIGGERS (
  38 +SCHED_NAME VARCHAR(120) NOT NULL,
  39 +TRIGGER_NAME VARCHAR(190) NOT NULL,
  40 +TRIGGER_GROUP VARCHAR(190) NOT NULL,
  41 +JOB_NAME VARCHAR(190) NOT NULL,
  42 +JOB_GROUP VARCHAR(190) NOT NULL,
  43 +DESCRIPTION VARCHAR(250) NULL,
  44 +NEXT_FIRE_TIME BIGINT(13) NULL,
  45 +PREV_FIRE_TIME BIGINT(13) NULL,
  46 +PRIORITY INTEGER NULL,
  47 +TRIGGER_STATE VARCHAR(16) NOT NULL,
  48 +TRIGGER_TYPE VARCHAR(8) NOT NULL,
  49 +START_TIME BIGINT(13) NOT NULL,
  50 +END_TIME BIGINT(13) NULL,
  51 +CALENDAR_NAME VARCHAR(190) NULL,
  52 +MISFIRE_INSTR SMALLINT(2) NULL,
  53 +JOB_DATA BLOB NULL,
  54 +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  55 +FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
  56 +REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
  57 +ENGINE=InnoDB;
  58 +
  59 +CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
  60 +SCHED_NAME VARCHAR(120) NOT NULL,
  61 +TRIGGER_NAME VARCHAR(190) NOT NULL,
  62 +TRIGGER_GROUP VARCHAR(190) NOT NULL,
  63 +REPEAT_COUNT BIGINT(7) NOT NULL,
  64 +REPEAT_INTERVAL BIGINT(12) NOT NULL,
  65 +TIMES_TRIGGERED BIGINT(10) NOT NULL,
  66 +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  67 +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  68 +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  69 +ENGINE=InnoDB;
  70 +
  71 +CREATE TABLE QRTZ_CRON_TRIGGERS (
  72 +SCHED_NAME VARCHAR(120) NOT NULL,
  73 +TRIGGER_NAME VARCHAR(190) NOT NULL,
  74 +TRIGGER_GROUP VARCHAR(190) NOT NULL,
  75 +CRON_EXPRESSION VARCHAR(120) NOT NULL,
  76 +TIME_ZONE_ID VARCHAR(80),
  77 +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  78 +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  79 +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  80 +ENGINE=InnoDB;
  81 +
  82 +CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  83 + (
  84 + SCHED_NAME VARCHAR(120) NOT NULL,
  85 + TRIGGER_NAME VARCHAR(190) NOT NULL,
  86 + TRIGGER_GROUP VARCHAR(190) NOT NULL,
  87 + STR_PROP_1 VARCHAR(512) NULL,
  88 + STR_PROP_2 VARCHAR(512) NULL,
  89 + STR_PROP_3 VARCHAR(512) NULL,
  90 + INT_PROP_1 INT NULL,
  91 + INT_PROP_2 INT NULL,
  92 + LONG_PROP_1 BIGINT NULL,
  93 + LONG_PROP_2 BIGINT NULL,
  94 + DEC_PROP_1 NUMERIC(13,4) NULL,
  95 + DEC_PROP_2 NUMERIC(13,4) NULL,
  96 + BOOL_PROP_1 VARCHAR(1) NULL,
  97 + BOOL_PROP_2 VARCHAR(1) NULL,
  98 + PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  99 + FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  100 + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  101 +ENGINE=InnoDB;
  102 +
  103 +CREATE TABLE QRTZ_BLOB_TRIGGERS (
  104 +SCHED_NAME VARCHAR(120) NOT NULL,
  105 +TRIGGER_NAME VARCHAR(190) NOT NULL,
  106 +TRIGGER_GROUP VARCHAR(190) NOT NULL,
  107 +BLOB_DATA BLOB NULL,
  108 +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  109 +INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
  110 +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  111 +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  112 +ENGINE=InnoDB;
  113 +
  114 +CREATE TABLE QRTZ_CALENDARS (
  115 +SCHED_NAME VARCHAR(120) NOT NULL,
  116 +CALENDAR_NAME VARCHAR(190) NOT NULL,
  117 +CALENDAR BLOB NOT NULL,
  118 +PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
  119 +ENGINE=InnoDB;
  120 +
  121 +CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
  122 +SCHED_NAME VARCHAR(120) NOT NULL,
  123 +TRIGGER_GROUP VARCHAR(190) NOT NULL,
  124 +PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
  125 +ENGINE=InnoDB;
  126 +
  127 +CREATE TABLE QRTZ_FIRED_TRIGGERS (
  128 +SCHED_NAME VARCHAR(120) NOT NULL,
  129 +ENTRY_ID VARCHAR(95) NOT NULL,
  130 +TRIGGER_NAME VARCHAR(190) NOT NULL,
  131 +TRIGGER_GROUP VARCHAR(190) NOT NULL,
  132 +INSTANCE_NAME VARCHAR(190) NOT NULL,
  133 +FIRED_TIME BIGINT(13) NOT NULL,
  134 +SCHED_TIME BIGINT(13) NOT NULL,
  135 +PRIORITY INTEGER NOT NULL,
  136 +STATE VARCHAR(16) NOT NULL,
  137 +JOB_NAME VARCHAR(190) NULL,
  138 +JOB_GROUP VARCHAR(190) NULL,
  139 +IS_NONCONCURRENT VARCHAR(1) NULL,
  140 +REQUESTS_RECOVERY VARCHAR(1) NULL,
  141 +PRIMARY KEY (SCHED_NAME,ENTRY_ID))
  142 +ENGINE=InnoDB;
  143 +
  144 +CREATE TABLE QRTZ_SCHEDULER_STATE (
  145 +SCHED_NAME VARCHAR(120) NOT NULL,
  146 +INSTANCE_NAME VARCHAR(190) NOT NULL,
  147 +LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
  148 +CHECKIN_INTERVAL BIGINT(13) NOT NULL,
  149 +PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
  150 +ENGINE=InnoDB;
  151 +
  152 +CREATE TABLE QRTZ_LOCKS (
  153 +SCHED_NAME VARCHAR(120) NOT NULL,
  154 +LOCK_NAME VARCHAR(40) NOT NULL,
  155 +PRIMARY KEY (SCHED_NAME,LOCK_NAME))
  156 +ENGINE=InnoDB;
  157 +
  158 +CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
  159 +CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
  160 +
  161 +CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
  162 +CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
  163 +CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
  164 +CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
  165 +CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
  166 +CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
  167 +CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
  168 +CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
  169 +CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
  170 +CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
  171 +CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
  172 +CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
  173 +
  174 +CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
  175 +CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
  176 +CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
  177 +CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
  178 +CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
  179 +CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
  180 +
  181 +commit;
src/main/java/cn/iocoder/dashboard/framework/quartz/core/enums/JobDataKeyEnum.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.quartz.core.enums;
  2 +
  3 +/**
  4 + * Quartz Job Data 的 key 枚举
  5 + */
  6 +public enum JobDataKeyEnum {
  7 +
  8 + JOB_ID,
  9 + JOB_HANDLER_NAME,
  10 + JOB_HANDLER_PARAM
  11 +
  12 +}
src/main/java/cn/iocoder/dashboard/framework/quartz/core/handler/JobHandler.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.quartz.core.handler;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.CommonResult;
  4 +
  5 +/**
  6 + * 任务处理器
  7 + *
  8 + * @author 芋道源码
  9 + */
  10 +public interface JobHandler {
  11 +
  12 + /**
  13 + * 执行任务
  14 + *
  15 + * @param param 参数
  16 + * @return 结果
  17 + * @throws Exception 异常
  18 + */
  19 + CommonResult<String> execute(String param) throws Exception;
  20 +
  21 +}
src/main/java/cn/iocoder/dashboard/framework/quartz/core/handler/JobHandlerInvoker.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.quartz.core.handler;
  2 +
  3 +import cn.iocoder.dashboard.framework.quartz.core.enums.JobDataKeyEnum;
  4 +import org.quartz.DisallowConcurrentExecution;
  5 +import org.quartz.JobExecutionContext;
  6 +import org.quartz.PersistJobDataAfterExecution;
  7 +import org.springframework.context.ApplicationContext;
  8 +import org.springframework.scheduling.quartz.QuartzJobBean;
  9 +
  10 +import javax.annotation.Resource;
  11 +
  12 +/**
  13 + * 基础 Job 调用者,负责调用 {@link JobHandler#execute(String)} 执行任务
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@PersistJobDataAfterExecution
  18 +@DisallowConcurrentExecution
  19 +public class JobHandlerInvoker extends QuartzJobBean {
  20 +
  21 + @Resource
  22 + private ApplicationContext applicationContext;
  23 +
  24 + @Override
  25 + protected void executeInternal(JobExecutionContext executionContext) {
  26 + // 获得 JobHandler 对象
  27 + String jobHandlerName = getJobData(executionContext, JobDataKeyEnum.JOB_HANDLER_NAME);
  28 + JobHandler jobHandler = applicationContext.getBean(jobHandlerName, JobHandler.class);
  29 +
  30 + // 执行任务
  31 + String jobParam = getJobData(executionContext, JobDataKeyEnum.JOB_HANDLER_PARAM);
  32 + try {
  33 + jobHandler.execute(jobParam);
  34 + } catch (Exception e) {
  35 + // TODO 需要后续处理
  36 + }
  37 + }
  38 +
  39 + @SuppressWarnings("SwitchStatementWithTooFewBranches")
  40 + private static String getJobData(JobExecutionContext executionContext, JobDataKeyEnum key) {
  41 + switch (key) {
  42 + case JOB_ID:
  43 + return executionContext.getJobDetail().getJobDataMap().getString(key.name());
  44 + default:
  45 + return executionContext.getTrigger().getJobDataMap().getString(key.name());
  46 + }
  47 + }
  48 +
  49 +}
src/main/java/cn/iocoder/dashboard/framework/quartz/core/scheduler/SchedulerManager.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.quartz.core.scheduler;
  2 +
  3 +import cn.iocoder.dashboard.framework.quartz.core.enums.JobDataKeyEnum;
  4 +import cn.iocoder.dashboard.framework.quartz.core.handler.JobHandlerInvoker;
  5 +import org.quartz.*;
  6 +
  7 +/**
  8 + * {@link org.quartz.Scheduler} 的管理器,负责创建任务
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +public class SchedulerManager {
  13 +
  14 + private final Scheduler scheduler;
  15 +
  16 + public SchedulerManager(Scheduler scheduler) {
  17 + this.scheduler = scheduler;
  18 + }
  19 +
  20 + public void addJob(Long jobId, String jobHandlerName, String jobHandlerParam,
  21 + String triggerName, String cronExpression)
  22 + throws SchedulerException {
  23 + // 创建 JobDetail 对象
  24 + JobDetail jobDetail = JobBuilder.newJob(JobHandlerInvoker.class)
  25 + .usingJobData(JobDataKeyEnum.JOB_ID.name(), jobId)
  26 + .withIdentity(jobHandlerName).build();
  27 + // 创建 Trigger 对象
  28 + Trigger trigger = TriggerBuilder.newTrigger()
  29 + .withIdentity(triggerName)
  30 + .usingJobData(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName)
  31 + .usingJobData(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam)
  32 + .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
  33 + .build();
  34 + // 新增调度
  35 + scheduler.scheduleJob(jobDetail, trigger);
  36 + }
  37 +
  38 + public void updateJob(String jobHandlerName, String jobHandlerParam,
  39 + String triggerName, String cronExpression) throws SchedulerException {
  40 + // 创建 Trigger 对象
  41 + Trigger trigger = TriggerBuilder.newTrigger()
  42 + .withIdentity(triggerName)
  43 + .usingJobData(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName)
  44 + .usingJobData(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam)
  45 + .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
  46 + .build();
  47 + // 修改调度
  48 + scheduler.rescheduleJob(new TriggerKey(triggerName), trigger);
  49 + }
  50 +
  51 + public void deleteJob(String jobHandlerName) throws SchedulerException {
  52 + scheduler.deleteJob(new JobKey(jobHandlerName));
  53 + }
  54 +
  55 + public void pauseJob(String jobHandlerName) throws SchedulerException {
  56 + scheduler.pauseJob(new JobKey(jobHandlerName));
  57 + }
  58 +
  59 + public void resumeJob(String jobHandlerName,
  60 + String triggerName) throws SchedulerException {
  61 + scheduler.resumeJob(new JobKey(jobHandlerName));
  62 + scheduler.resumeTrigger(new TriggerKey(triggerName));
  63 + }
  64 +
  65 + public void triggerJob(Long jobId, String jobHandlerName, String jobHandlerParam)
  66 + throws SchedulerException {
  67 + JobDataMap data = new JobDataMap();
  68 + data.put(JobDataKeyEnum.JOB_ID.name(), jobId);
  69 + data.put(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName);
  70 + data.put(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam);
  71 + // 触发任务
  72 + scheduler.triggerJob(new JobKey(jobHandlerName), data);
  73 + }
  74 +
  75 +}
src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJob.java renamed to src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobDO.java
@@ -12,7 +12,7 @@ import lombok.ToString; @@ -12,7 +12,7 @@ import lombok.ToString;
12 import java.util.Date; 12 import java.util.Date;
13 13
14 /** 14 /**
15 - * 定时任务表 15 + * 定时任务 DO
16 * 16 *
17 * @author 芋道源码 17 * @author 芋道源码
18 */ 18 */
@@ -20,7 +20,7 @@ import java.util.Date; @@ -20,7 +20,7 @@ import java.util.Date;
20 @Data 20 @Data
21 @EqualsAndHashCode(callSuper = true) 21 @EqualsAndHashCode(callSuper = true)
22 @ToString(callSuper = true) 22 @ToString(callSuper = true)
23 -public class InfJob extends BaseDO { 23 +public class InfJobDO extends BaseDO {
24 24
25 /** 25 /**
26 * 任务编号 26 * 任务编号
src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobLog.java renamed to src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobLogDO.java
@@ -18,7 +18,7 @@ import java.util.Date; @@ -18,7 +18,7 @@ import java.util.Date;
18 @Data 18 @Data
19 @EqualsAndHashCode(callSuper = true) 19 @EqualsAndHashCode(callSuper = true)
20 @ToString(callSuper = true) 20 @ToString(callSuper = true)
21 -public class InfJobLog extends BaseDO { 21 +public class InfJobLogDO extends BaseDO {
22 22
23 /** 23 /**
24 * 日志编号 24 * 日志编号
@@ -27,31 +27,31 @@ public class InfJobLog extends BaseDO { @@ -27,31 +27,31 @@ public class InfJobLog extends BaseDO {
27 /** 27 /**
28 * 任务编号 28 * 任务编号
29 * 29 *
30 - * 关联 {@link InfJob#getId()} 30 + * 关联 {@link InfJobDO#getId()}
31 */ 31 */
32 private Long jobId; 32 private Long jobId;
33 /** 33 /**
34 * 任务名称 34 * 任务名称
35 * 35 *
36 - * 冗余字段 {@link InfJob#getName()} 36 + * 冗余字段 {@link InfJobDO#getName()}
37 */ 37 */
38 private String jobName; 38 private String jobName;
39 /** 39 /**
40 * 任务分组 40 * 任务分组
41 * 41 *
42 - * 冗余字段 {@link InfJob#getGroup()} 42 + * 冗余字段 {@link InfJobDO#getGroup()}
43 */ 43 */
44 private String jobGroup; 44 private String jobGroup;
45 /** 45 /**
46 * 处理器的名字 46 * 处理器的名字
47 * 47 *
48 - * 冗余字段 {@link InfJob#getHandlerName()} 48 + * 冗余字段 {@link InfJobDO#getHandlerName()}
49 */ 49 */
50 private String handlerName; 50 private String handlerName;
51 /** 51 /**
52 * 处理器的参数 52 * 处理器的参数
53 * 53 *
54 - * 冗余字段 {@link InfJob#getHandlerParam()} 54 + * 冗余字段 {@link InfJobDO#getHandlerParam()}
55 */ 55 */
56 private String handlerParam; 56 private String handlerParam;
57 57
@@ -82,7 +82,7 @@ public class InfJobLog extends BaseDO { @@ -82,7 +82,7 @@ public class InfJobLog extends BaseDO {
82 /** 82 /**
83 * 结果数据 83 * 结果数据
84 * 84 *
85 - * 如果是对象,则使用 JSON 格式化 85 + * 目前使用的 {@link CommonResult#getData()} 数据
86 */ 86 */
87 private String resultData; 87 private String resultData;
88 88
src/main/resources/application.yaml
@@ -42,6 +42,35 @@ spring: @@ -42,6 +42,35 @@ spring:
42 # main: 42 # main:
43 # lazy-initialization: true # TODO 芋艿:本地开发环境,可以配置下 lazy 延迟加载 43 # lazy-initialization: true # TODO 芋艿:本地开发环境,可以配置下 lazy 延迟加载
44 44
  45 + # Quartz 配置项,对应 QuartzProperties 配置类
  46 + quartz:
  47 + scheduler-name: clusteredScheduler # Scheduler 名字。默认为 schedulerName
  48 + job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
  49 + auto-startup: true # Quartz 是否自动启动
  50 + startup-delay: 0 # 延迟 N 秒启动
  51 + wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
  52 + overwrite-existing-jobs: false # 是否覆盖已有 Job 的配置
  53 + properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档
  54 + org:
  55 + quartz:
  56 + # JobStore 相关配置
  57 + jobStore:
  58 + # 数据源名称
  59 +# dataSource: quartzDataSource # 使用的数据源 TODO 使用默认数据源
  60 + class: org.quartz.impl.jdbcjobstore.JobStoreTX # JobStore 实现类
  61 + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  62 + tablePrefix: QRTZ_ # Quartz 表前缀
  63 + isClustered: true # 是集群模式
  64 + clusterCheckinInterval: 1000
  65 + useProperties: false
  66 + # 线程池相关配置
  67 + threadPool:
  68 + threadCount: 25 # 线程池大小。默认为 10 。
  69 + threadPriority: 5 # 线程优先级
  70 + class: org.quartz.simpl.SimpleThreadPool # 线程池类型
  71 + jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置
  72 + initialize-schema: never # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。
  73 +
45 # 芋道配置项,设置当前项目所有自定义的配置 74 # 芋道配置项,设置当前项目所有自定义的配置
46 yudao: 75 yudao:
47 info: 76 info: