Maven依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>
集群模式代码
Scheduler对象由Springboot提供,直接注入得到
Quartz集群基于数据库,存储类型必须以jdbc,不需要类似注册中心的服务
配置文件
如果要持久化任务就要配置数据库,quartz会自动生成表
建议提前将quartz提供的表生成好
server:
port: 8101
spring:
# 整合数据库
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/quartz_study?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai
username: root
password: 1234
quartz:
#相关属性配置
properties:
org:
quartz:
scheduler:
# 集群名字 会以集群区分
instanceName: DefaultQuartzScheduler
# 节点id 集群内唯一
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 表前缀 针对数据库编码问题要注意大小写
tablePrefix: QRTZ_
# 为true 开启集群模式
isClustered: false
clusterCheckinInterval: 10000
useProperties: true
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
#数据库方式
job-store-type: jdbc
#初始化表结构 never表示不自动生成
jdbc:
initialize-schema: never
Job类
不用实现Job接口,继承QuartzJobBean抽象类,QuartzJobBean底层实现了Job接口
用法和Job接口差不多
自动关联Trigger和JobDetail
Spring Boot 的quartz的starter自带了Scheduler的Bean对象
创建JobDetail和Trigger的Bean对象,Spring会自动关联
但个人不推荐这样,因为通常来说如果用任务调度,会需要很多的job
@Configuration
public class JobConfig {
@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob(SpringJob.class)
.withIdentity("SpringJob", "group1")
.storeDurably()
.build();
}
@Bean
public Trigger trigger() {
return TriggerBuilder.newTrigger()
.withIdentity("SpringTrigger", "group1")
.startNow()
// 与job关联
.forJob(jobDetail())
.withSchedule(
CronScheduleBuilder.cronSchedule("0/2 * * * * ? ")
)
.build();
}
}
偏原生写法(推荐)
还是推荐偏原生的写法,写在方法里面好一点,写在Service层代码封装,更加灵活
不推荐以Bean对象进行任务执行
@Autowired
public Scheduler scheduler;
public void startJob() throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(SpringJob.class).build();
Trigger trigger = TriggerBuilder.newTrigger()
.startNow()
.build();
scheduler.scheduleJob(jobDetail, trigger);
}
数据库表
根据配置的数据库找到对应数据库的sql然后执行,也可以手动添加表
可以根据导入的maven依赖找
找到这个mysql_innodb
上面的配置文件已经配置了数据库,配置数据库 就会把job trigger scheduler记录下来
在数据库表中直接删除job
依次删除表
QRTZ_CRON_TRIGGERS、
QRTZ_SIMPLE_TRIGGERS、
QRTZ_TRIGGERS、
QRTZ_JOB_DETAILS
删除对应的job数据即可
