Spring Boot 为使用 Quartz 调度程序提供了多种便利,包括 spring-boot-starter-quartz “Starter”。如果 Quartz 可用,则会自动配置调度程序(通过 SchedulerFactoryBean 抽象)。
以下类型的 Bean 会自动拾取并与调度程序关联:
- JobDetail:定义一个特定的Job。 JobDetail 实例可以使用 JobBuilder API 构建。
- Calendar
- Trigger:定义何时触发特定作业。
默认情况下,使用内存中的 JobStore。但是,如果 DataSource bean 在您的应用程序中可用并且相应地配置了 spring.quartz.job-store-type 属性,则可以配置基于 JDBC 的存储。
使用
1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
2 配置文件
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/quartz?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username: username
password: password
quartz:
jdbc:
# 自动生成quartz需要的表
initialize-schema: always
#相关属性配置
properties:
org:
quartz:
scheduler:
# 调度器实例名称
instanceName: clusteredScheduler
# 调度器实例ID自动生成
instanceId: AUTO
jobStore:
# 调度信息存储处理类
class: org.quartz.impl.jdbcjobstore.JobStoreTX
# JDBC的驱动
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# quartz相关表的前缀
tablePrefix: QRTZ_
# 是否将JobDataMap中的属性转为字符串存储
useProperties: true
threadPool:
# 指定线程池实现类,对调度器提供固定大小的线程池
class: org.quartz.simpl.SimpleThreadPool
# 设置并发线程数量
threadCount: 100
# 指定线程优先级
threadPriority: 5
# quartz任务存储类型:jdbc或memory
job-store-type: jdbc
3 添加config文件
@Configuration
public class QuartzConfig {
@Bean
public JobDetail myJob1Detail() {
return JobBuilder
.newJob(TestJob1.class)
.withIdentity("myJob1")
.storeDurably()
.build();
}
@Bean
public Trigger myJob1Trigger() {
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/3 * * * * ?");
return TriggerBuilder.newTrigger()
.forJob(myJob1Detail())
.withIdentity("myJob1Trigger")
.withSchedule(cronScheduleBuilder)
.build();
}
@Bean
public JobDetail myJob2Detail() {
return JobBuilder
.newJob(TestJob2.class)
.withIdentity("myJob2")
.storeDurably()
.build();
}
@Bean
public Trigger myJob2Trigger() {
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/3 * * * * ?");
return TriggerBuilder.newTrigger()
.forJob(myJob2Detail())
.withIdentity("myJob2Trigger")
.withSchedule(cronScheduleBuilder)
.build();
}
}
4 添加执行逻辑的Job
public class TestJob1 implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) {
// ..
}
}
public class TestJob2 extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) {
// ..
}
}
通过这几步的配置就可以使用Spring Boot提供的Quartz Scheduler功能了