Java定时框架Quartz实例详解与定时任务的Mongodb、Mysql持久化实现(三)Quartz持久化

释放双眼,带上耳机,听听看~!

(一)Quartz组件详解

(二)Quartz配置详解

就像我在上一篇中说的,把调度器信息存储在内存中非常的快也易于配置。但当调度器进程一旦被终止,所有的 Job 和 Trigger 的状态就丢失了。所以我们就需要把调度器信息持久化到数据库,在服务器重启时就可以自动启动终止的任务。Quartz不可能没有考虑到这个问题,可以通过引入Jar包与配置实现,并支持多种数据库版本。

一、持久化到MongoDB

1、引入Jar依赖

好吧,我承认,这竟然是我做这个工作最费时的一步。我竟然没找到现成的Jar包?!这个还好,我是用Maven的嘛,我引入依赖就好了嘛,结果竟然在中央版本库中找不到这个依赖?!好吧……经过了中间省略无数尝试后,终于在git上找到了这个依赖的仓库,引入到pom.xml中:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1<repositories>
2   <repository>
3       <id>clojars.org</id>
4       <url>http://clojars.org/repo</url>
5       <layout>default</layout>
6       <releases>
7           <enabled>true</enabled>
8           <updatePolicy>never</updatePolicy>
9       </releases>
10      <snapshots>
11          <enabled>true</enabled>
12          <updatePolicy>never</updatePolicy>
13      </snapshots>
14  </repository>
15</repositories>
16

1
2
1**引入依赖:**
2

1
2
3
4
5
6
1<dependency>
2   <groupId>com.novemberain</groupId>
3   <artifactId>quartz-mongodb</artifactId>
4   <version>2.0.0-rc2</version>
5</dependency>
6

1
2
1**二、配置quartz.properties**
2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1# Scheduler Properties
2org.quartz.scheduler.instanceName = MyScheduler
3org.quartz.scheduler.instanceId = AUTO
4# ThreadPool Properties
5org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
6org.quartz.threadPool.threadCount = 1
7org.quartz.threadPool.threadPriority = 5
8# JobStore Properties  
9org.quartz.jobStore.class=com.novemberain.quartz.mongodb.MongoDBJobStore  
10org.quartz.jobStore.mongoUri=mongodb://localhost:27017    
11org.quartz.jobStore.dbName=quartzJobs  
12org.quartz.jobStore.collectionPrefix=job  
13org.quartz.jobStore.misfireThreshold=60000  
14

1
2
1其中调度器与线程池的配置在上一篇中说过了,这里主要说明JobStore的配置:
2

class属性不再使用RamJobStore,改为使用MongoDBJobStore,这标志改为使用MongoDB去存储调度信息;

mongoUrl,很清楚,mongo的访问路径;

dbName,也很清楚,存储调度信息的mongo集合名;

collectionPrefix,是一个标志性集合名的前缀,用于区别其他用途的集合;

misfireThreadhold,这个就需要说说什么是misfire了,就是在该执行job的时候,因为系统崩溃等原因没有执行,则这时候就需要错失执行策略了,这个东西比较复杂,可以参看这篇博客http://www.blogjava.net/zuxiong/archive/2016/03/03/429525.aspx

3、在web.xml中配置quartz.properties,在服务器启动时加载这个配置文件


1
2
3
4
5
6
7
8
9
10
11
12
13
14
1<servlet>
2   <servlet-name>QuartzInitializer</servlet-name>
3   <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
4   <init-param>
5       <param-name>shutdown-on-unload</param-name>
6       <param-value>true</param-value>
7   </init-param>
8   <init-param>
9       <param-name>config-file</param-name>
10      <param-value>quartz.properties</param-value>
11  </init-param>
12  <load-on-startup>1</load-on-startup>
13</servlet>
14

1
2
1**4、启动服务器后,就会看到MongoDB中产生对应数据库结构:**
2

然后,启动任务,调度信息就会存储到Mongo中,在服务器重启后,仍然会启动未终止的任务。支持持久化到MongoDB完成!

二、持久化到Mysql

1、引入jar


1
2
3
4
5
6
1<dependency>
2       <groupId>mysql</groupId>
3       <artifactId>mysql-connector-java</artifactId>
4       <version>5.1.35</version>
5</dependency>
6

1
2
1**2、配置quartz-properties**  
2

1
2
3
4
5
6
1#org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
2#org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8
3#org.quartz.dataSource.myDS.user = root
4#org.quartz.dataSource.myDS.password =
5#org.quartz.dataSource.myDS.maxConnections = 5
6

1
2
1**3、在数据库中创建表结构**  
2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
1#
2# Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar
3#
4# PLEASE consider using mysql with innodb tables to avoid locking issues
5#
6# In your Quartz properties file, you'll need to set
7# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
8#
9
10DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
11DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
12DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
13DROP TABLE IF EXISTS QRTZ_LOCKS;
14DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
15DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
16DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
17DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
18DROP TABLE IF EXISTS QRTZ_TRIGGERS;
19DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
20DROP TABLE IF EXISTS QRTZ_CALENDARS;
21
22
23CREATE TABLE QRTZ_JOB_DETAILS
24  (
25    SCHED_NAME VARCHAR(120) NOT NULL,
26    JOB_NAME  VARCHAR(200) NOT NULL,
27    JOB_GROUP VARCHAR(200) NOT NULL,
28    DESCRIPTION VARCHAR(250) NULL,
29    JOB_CLASS_NAME   VARCHAR(250) NOT NULL,
30    IS_DURABLE VARCHAR(1) NOT NULL,
31    IS_NONCONCURRENT VARCHAR(1) NOT NULL,
32    IS_UPDATE_DATA VARCHAR(1) NOT NULL,
33    REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
34    JOB_DATA BLOB NULL,
35    PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
36);
37
38CREATE TABLE QRTZ_TRIGGERS
39  (
40    SCHED_NAME VARCHAR(120) NOT NULL,
41    TRIGGER_NAME VARCHAR(200) NOT NULL,
42    TRIGGER_GROUP VARCHAR(200) NOT NULL,
43    JOB_NAME  VARCHAR(200) NOT NULL,
44    JOB_GROUP VARCHAR(200) NOT NULL,
45    DESCRIPTION VARCHAR(250) NULL,
46    NEXT_FIRE_TIME BIGINT(13) NULL,
47    PREV_FIRE_TIME BIGINT(13) NULL,
48    PRIORITY INTEGER NULL,
49    TRIGGER_STATE VARCHAR(16) NOT NULL,
50    TRIGGER_TYPE VARCHAR(8) NOT NULL,
51    START_TIME BIGINT(13) NOT NULL,
52    END_TIME BIGINT(13) NULL,
53    CALENDAR_NAME VARCHAR(200) NULL,
54    MISFIRE_INSTR SMALLINT(2) NULL,
55    JOB_DATA BLOB NULL,
56    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
57    FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
58        REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
59);
60
61CREATE TABLE QRTZ_SIMPLE_TRIGGERS
62  (
63    SCHED_NAME VARCHAR(120) NOT NULL,
64    TRIGGER_NAME VARCHAR(200) NOT NULL,
65    TRIGGER_GROUP VARCHAR(200) NOT NULL,
66    REPEAT_COUNT BIGINT(7) NOT NULL,
67    REPEAT_INTERVAL BIGINT(12) NOT NULL,
68    TIMES_TRIGGERED BIGINT(10) NOT NULL,
69    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
70    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
71        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
72);
73
74CREATE TABLE QRTZ_CRON_TRIGGERS
75  (
76    SCHED_NAME VARCHAR(120) NOT NULL,
77    TRIGGER_NAME VARCHAR(200) NOT NULL,
78    TRIGGER_GROUP VARCHAR(200) NOT NULL,
79    CRON_EXPRESSION VARCHAR(200) NOT NULL,
80    TIME_ZONE_ID VARCHAR(80),
81    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
82    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
83        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
84);
85
86CREATE TABLE QRTZ_SIMPROP_TRIGGERS
87  (          
88    SCHED_NAME VARCHAR(120) NOT NULL,
89    TRIGGER_NAME VARCHAR(200) NOT NULL,
90    TRIGGER_GROUP VARCHAR(200) NOT NULL,
91    STR_PROP_1 VARCHAR(512) NULL,
92    STR_PROP_2 VARCHAR(512) NULL,
93    STR_PROP_3 VARCHAR(512) NULL,
94    INT_PROP_1 INT NULL,
95    INT_PROP_2 INT NULL,
96    LONG_PROP_1 BIGINT NULL,
97    LONG_PROP_2 BIGINT NULL,
98    DEC_PROP_1 NUMERIC(13,4) NULL,
99    DEC_PROP_2 NUMERIC(13,4) NULL,
100    BOOL_PROP_1 VARCHAR(1) NULL,
101    BOOL_PROP_2 VARCHAR(1) NULL,
102    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
103    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
104    REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
105);
106
107CREATE TABLE QRTZ_BLOB_TRIGGERS
108  (
109    SCHED_NAME VARCHAR(120) NOT NULL,
110    TRIGGER_NAME VARCHAR(200) NOT NULL,
111    TRIGGER_GROUP VARCHAR(200) NOT NULL,
112    BLOB_DATA BLOB NULL,
113    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
114    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
115        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
116);
117
118CREATE TABLE QRTZ_CALENDARS
119  (
120    SCHED_NAME VARCHAR(120) NOT NULL,
121    CALENDAR_NAME  VARCHAR(200) NOT NULL,
122    CALENDAR BLOB NOT NULL,
123    PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
124);
125
126CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
127  (
128    SCHED_NAME VARCHAR(120) NOT NULL,
129    TRIGGER_GROUP  VARCHAR(200) NOT NULL,
130    PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
131);
132
133CREATE TABLE QRTZ_FIRED_TRIGGERS
134  (
135    SCHED_NAME VARCHAR(120) NOT NULL,
136    ENTRY_ID VARCHAR(95) NOT NULL,
137    TRIGGER_NAME VARCHAR(200) NOT NULL,
138    TRIGGER_GROUP VARCHAR(200) NOT NULL,
139    INSTANCE_NAME VARCHAR(200) NOT NULL,
140    FIRED_TIME BIGINT(13) NOT NULL,
141    SCHED_TIME BIGINT(13) NOT NULL,
142    PRIORITY INTEGER NOT NULL,
143    STATE VARCHAR(16) NOT NULL,
144    JOB_NAME VARCHAR(200) NULL,
145    JOB_GROUP VARCHAR(200) NULL,
146    IS_NONCONCURRENT VARCHAR(1) NULL,
147    REQUESTS_RECOVERY VARCHAR(1) NULL,
148    PRIMARY KEY (SCHED_NAME,ENTRY_ID)
149);
150
151CREATE TABLE QRTZ_SCHEDULER_STATE
152  (
153    SCHED_NAME VARCHAR(120) NOT NULL,
154    INSTANCE_NAME VARCHAR(200) NOT NULL,
155    LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
156    CHECKIN_INTERVAL BIGINT(13) NOT NULL,
157    PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
158);
159
160CREATE TABLE QRTZ_LOCKS
161  (
162    SCHED_NAME VARCHAR(120) NOT NULL,
163    LOCK_NAME  VARCHAR(40) NOT NULL,
164    PRIMARY KEY (SCHED_NAME,LOCK_NAME)
165);
166

1
2
1**四、web.xml配置后即可完成持久化**
2

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索