使用springboot 2.0整合quartz實(shí)現(xiàn)動(dòng)態(tài)新增定時(shí)任務(wù)持久化到數(shù)據(jù)庫
Maven依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
// quartz 任務(wù)持久化默認(rèn)使用C3P0連接池
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
任務(wù)持久化Yaml配置
spring:
application:
name: quartz-test
quartz:
# job持久化到數(shù)據(jù)庫方式
job-store-type: jdbc
properties:
org:
quartz:
scheduler:
instanceName: DefaultQuartzScheduler
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
isClustered: true
dataSource: default
clusterCheckinInterval: 10000
useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
dataSource:
default:
URL: jdbc:mysql://localhost:3306/quartz-test?serverTimezone=CTT&characterEncoding=utf8&useUnicode=true&useSSL=false&autoReconnect=true&allowMultiQueries=true&nullCatalogMeansCurrent=true
user: root
password: 123456
driver: com.mysql.cj.jdbc.Driver
maxConnections: 10
validateOnCheckout: true
validationQuery: select 1
初始化 Quartz mysql表
官網(wǎng)下載Quartz壓縮包,解壓后在docs\dbTables目錄下看到很多對(duì)應(yīng)不同數(shù)據(jù)庫的SQL腳本,找到 tables_mysql.sql 腳本手動(dòng)初始化(注:創(chuàng)建的數(shù)據(jù)庫最好是GBK格式的,否則需要手動(dòng)修改腳本字段長(zhǎng)度 )
動(dòng)態(tài)新增quartz任務(wù)
- Scheduler - 與調(diào)度程序交互的主要API。
- Job - 你想要調(diào)度器執(zhí)行的任務(wù)組件需要實(shí)現(xiàn)的接口
- JobDetail - 用于定義作業(yè)的實(shí)例。
- Trigger(即觸發(fā)器) - 定義執(zhí)行給定作業(yè)的計(jì)劃的組件。
- JobBuilder - 用于定義/構(gòu)建 JobDetail 實(shí)例,用于定義作業(yè)的實(shí)例。
- TriggerBuilder - 用于定義/構(gòu)建觸發(fā)器實(shí)例。
- Scheduler 的生命期,從 SchedulerFactory 創(chuàng)建它時(shí)開始,到 Scheduler 調(diào)用shutdown() 方法時(shí)結(jié)束;Scheduler 被創(chuàng)建后,可以增加、刪除和列舉 Job 和 Trigger,以及執(zhí)行其它與調(diào)度相關(guān)的操作(如暫停 Trigger)。但是,Scheduler 只有在調(diào)用 start() 方法后,才會(huì)真正地觸發(fā) trigger(即執(zhí)行 job)
1. 動(dòng)態(tài)新增任務(wù)
創(chuàng)建 Job
public class TestQuartzJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String name = dataMap.getString("name");
System.out.println("hello " + name);
}
}
新增Job任務(wù)
public void addJob() {
String jobName = "test-" + System.currentTimeMillis();
String jobGroup = "group-1";
try {
JobDataMap dataMap = new JobDataMap();
dataMap.put("name", jobName);
JobDetail jobDetail = JobBuilder.newJob(TestQuartzJob.class)
.withIdentity(jobName, jobGroup)
.usingJobData(dataMap)// 任務(wù)名稱和組構(gòu)成任務(wù)key
.build();
// 定義調(diào)度觸發(fā)規(guī)則,使用cornTrigger規(guī)則
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup)// 觸發(fā)器key
.startAt(DateBuilder.futureDate(1, DateBuilder.IntervalUnit.SECOND))
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?"))
.startNow()
.build();
// 把作業(yè)和觸發(fā)器注冊(cè)到任務(wù)調(diào)度中
scheduler.scheduleJob(jobDetail, trigger);
// 啟動(dòng)
if (!scheduler.isShutdown()) {
scheduler.start();
}
}catch (Exception e) {
e.printStackTrace();
}
}
2. 動(dòng)態(tài)刪除任務(wù)
public void deleteJob() {
try {
JobKey jobKey = JobKey.jobKey("test-1614932418934", "group-1");
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
總結(jié):網(wǎng)上查詢springboot2.0整合quartz持久化任務(wù),發(fā)現(xiàn)很多方案都不可行,故此整理了一番,供大家一起學(xué)習(xí),不用找來找去。github 代碼地址:https://github.com/ltztao/springboot-quartz