使用springboot 2.0整合quartz实现动态新增定时任务持久化到数据库
Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
// quartz 任务持久化默认使用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>
任务持久化Yaml配置
spring:
application:
name: quartz-test
quartz:
# job持久化到数据库方式
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表
官网下载Quartz压缩包,解压后在docs\dbTables
目录下看到很多对应不同数据库的SQL脚本,找到 tables_mysql.sql
脚本手动初始化(注:创建的数据库最好是GBK格式的,否则需要手动修改脚本字段长度
)
动态新增quartz任务
- Scheduler - 与调度程序交互的主要API。
- Job - 你想要调度器执行的任务组件需要实现的接口
- JobDetail - 用于定义作业的实例。
- Trigger(即触发器) - 定义执行给定作业的计划的组件。
- JobBuilder - 用于定义/构建 JobDetail 实例,用于定义作业的实例。
- TriggerBuilder - 用于定义/构建触发器实例。
- Scheduler 的生命期,从 SchedulerFactory 创建它时开始,到 Scheduler 调用shutdown() 方法时结束;Scheduler 被创建后,可以增加、删除和列举 Job 和 Trigger,以及执行其它与调度相关的操作(如暂停 Trigger)。但是,Scheduler 只有在调用 start() 方法后,才会真正地触发 trigger(即执行 job)
1. 动态新增任务
创建 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任务
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)// 任务名称和组构成任务key
.build();
// 定义调度触发规则,使用cornTrigger规则
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup)// 触发器key
.startAt(DateBuilder.futureDate(1, DateBuilder.IntervalUnit.SECOND))
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?"))
.startNow()
.build();
// 把作业和触发器注册到任务调度中
scheduler.scheduleJob(jobDetail, trigger);
// 启动
if (!scheduler.isShutdown()) {
scheduler.start();
}
}catch (Exception e) {
e.printStackTrace();
}
}
2. 动态删除任务
public void deleteJob() {
try {
JobKey jobKey = JobKey.jobKey("test-1614932418934", "group-1");
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
总结:网上查询springboot2.0整合quartz持久化任务,发现很多方案都不可行,故此整理了一番,供大家一起学习,不用找来找去。github 代码地址:https://github.com/ltztao/springboot-quartz