1 概述
实际项目中,复杂的定时任务都会结合持久化,动态改变定时任务状态,本文将介绍基于Quartz
的定时任务单点持久化方式,通过RESTful
风格,演示定时任务的CRUD
,最后使用Swagger
测试。
2 数据库表说明
//Quartz表
qrtz_calendars:以 Blob 类型存储 Quartz 的 Calendar 信息
qrtz_cron_triggers:存储 Cron Trigger,包括 Cron 表达式和时区信息
qrtz_fired_triggers:存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息
qrtz_paused_trigger_grps:存储已暂停的 Trigger 组的信息
qrtz_scheduler_state:存储少量的有关调度器 (Scheduler) 的状态,和别的 调度器 (Scheduler)实例(假如是用于一个集群中)
qrtz_locks:储程序的非观锁的信息(假如使用了悲观锁)
qrtz_job_details:存储每一个已配置的 Job 的详细信息(jobDetail)
qrtz_job_listeners:存储有关已配置的 Job 监听器 的信息
qrtz_simple_triggers:存储简单的 Trigger,包括重复次数,间隔,以及已触的次数
qrtz_blog_triggers:以 Blob 类型存储的Trigger(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)
qrtz_trigger_listeners:存储已配置的触发器监听器 ( Trigger Listener ) 的信息
qrtz_triggers:存储已配置的 触发器 (Trigger) 的信息
//新建表
ScheduleJob:自定义定时任务详细状态表,方便管理定时任务
- 建表脚本:
/resourecs/quartz.sql
3 添加依赖
<!--quartz相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!--数据库相关依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
4 添加配置
#数据库连接池配置
spring:
datasource:
name: mysql_test
type: com.alibaba.druid.pool.DruidDataSource
#druid相关配置
druid:
#监控统计拦截的filters
filters: stat
driver-class-name: com.mysql.jdbc.Driver
#基本属性
url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
username: root
password: 123456
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
#Quartz配置
quartz:
jdbc:
initialize-schema: always
job-store-type: jdbc
##Mybatis配置
mybatis:
#Mapper.xml所在的位置
mapper-locations: classpath:mapping/*.xml
#entity扫描的包名
type-aliases-package: com.mkeeper.entity
5 Spring
接管Quartz
@Component
public class ScheduleJobFactory extends AdaptableJobFactory {
// 让不受spring管理的类具有spring自动注入的特性
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
autowireCapableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
6 Quartz
配置SchedulerFactoryBean
初始化
@Configuration
public class ScheduleConfig {
@Autowired
private ScheduleJobFactory scheduleJobFactory;
@Bean
@Qualifier("scheduleBean")
public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("dataSource") DataSource dataSource) {
SchedulerFactoryBean schedulerFactoryBean = new Sch