SpringBoot整合Quartz
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--支持通过jdbc连接数据库库-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
配置文件
spring:
quartz:
#相关属性配置
properties:
org:
quartz:
scheduler:
instanceName: testScheduler
instanceId: AUTO
jobStore:
# 默认存储在内存中,RAMJobStore快速轻便,但是当进程终止时,所有调度信息都会丢失;
#此处配置通过事务存储数据库;2.5.6版本之后,配置JobStoreTX要报错,调整配置
class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
# class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
#您需要为JobStore选择一个DriverDelegate才能使用。DriverDelegate负责执行特定数据库可能需要的任何JDBC工作
# StdJDBCDelegate是一个使用“vanilla”JDBC代码(和SQL语句)来执行其工作的委托,用于完全符合JDBC的驱动程序
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#表前缀
tablePrefix: QRTZ_
#数据源别名,自定义
dataSource: one
#是否加入集群(集群时,一个任务只有一个服务实例执行)
#设置为“true”以打开群集功能。如果您有多个Quartz实例使用同一组数据库表,则此属性必须设置为“true”,否则您将遇到破坏
isClustered: true
#调度实例失效的检查时间间隔
clusterCheckinInterval: 10000
#可以将“org.quartz.jobStore.useProperties”配置参数设置为“true”(默认为false),以指示JDBCJobStore将JobDataMaps中的所有值都作为字符串,
#因此可以作为名称 - 值对存储而不是在BLOB列中以其序列化形式存储更多复杂的对象。从长远来看,这是更安全的,因为您避免了将非String类序列化为BLOB的类版本问题
useProperties: false
# quartz线程池配置
threadPool:
#实例化ThreadPool时,使用的线程类为SimpleThreadPool
class: org.quartz.simpl.SimpleThreadPool
#threadCount和threadPriority将以setter的形式注入ThreadPool实例
#并发个数:如果只有几个工作每天触发几次 那么1个线程就可以,如果有成千上万的工作,每分钟都有很多工作 那么就需要50-100之间.
#只有1到100之间的数字是非常实用的
threadCount: 10
#优先级 默认值为5
threadPriority: 5
#可以是“true”或“false”,默认为false
threadsInheritContextClassLoaderOfInitializingThread: true
#数据库方式
job-store-type: jdbc
# 关闭系统的时候,等待定时任务完成
wait-for-jobs-to-complete-on-shutdown: true
# 初始化后是否自动启动计划程序
auto-startup: true
# 延迟启动
startup-delay: 5s
jdbc:
# SQL 初始化脚本中单行注释的前缀
comment-prefix: --
# 数据库架构初始化模式--never 从不进行初始化,always 每次都清空数据库进行初始化,embedded 只初始化内存数据库(默认值)
initialize-schema: always
# 用于初始化数据库架构的SQL文件的路径
# schema: classpath:database/mysql.sql
datasource:
url: jdbc:mysql://yourip/database?serverTimezone=GMT%2B8&characterEncoding=UTF-8&useSSL=false&
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
name: one
当前springboot版本为 2.6.3
如果spring boot 版本在2.5.7之前的 需要将 jobStore. class属性修改为 : org.quartz.impl.jdbcjobstore.JobStoreTX
配置类
@Configuration
public class TaskConfig {
@Bean
public JobDetailFactoryBean testTaskJob() {
JobDetailFactoryBean jobDetail = new JobDetailFactoryBean();
jobDetail.setName("test_task");
jobDetail.setGroup("test_task_group");
jobDetail.setJobClass(TestJob.class);
jobDetail.setDurability(true);
return jobDetail;
}
@Bean
public CronTriggerFactoryBean testTaskJobTrigger() {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(testTaskJob().getObject());
// 每隔5s 触发
trigger.setCronExpression("0/5 * * * * ? ");
trigger.setName("testTaskJobTrigger");
trigger.setMisfireInstruction(0);
return trigger;
}
}
任务详情
package com.tlj.quartz.service;
import lombok.extern.slf4j.Slf4j;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* @Author: tanglj
* @Date: 2022/8/16
* @Description:
*/
// 不允许并发执行
@DisallowConcurrentExecution
@Slf4j
public class TestJob extends QuartzJobBean {
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
log.info("执行任务啦");
}
}