概述
本文介绍如何把Quartz定时任务做成接口,实现以下功能的动态配置:
- 添加任务
- 修改任务
- 暂停任务
- 恢复任务
- 删除任务
- 任务列表
- 任务详情
注:添加任务接口仍然需要开发者提前准备好任务类,接口的目的是实现定时任务的动态调整,按需进行开关和修改,请注意这点。
Spring Boot整合Quartz
简单说下Quartz的整合,做一下准备工作。
导入Quartz依赖
xml复制代码<!--Quartz定时任务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
配置文件中增加Quartz的支持
yml复制代码spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: xxx
username: xxx
password: xxx
quartz:
job-store-type: jdbc # 定时任务的数据保存到jdbc即数据库中
jdbc:
# embedded:默认
# always:启动的时候初始化表,我们只在第一次启动的时候用它来自动创建表,然后改回embedded即可,不然数据每次都会被清空
# never:启动的时候不初始化表,也不知道和embedded有什么不同
initialize-schema: embedded
第一次启动的时候请把上面的initialize-schema设置为always,这会在数据库里面自动建表,然后第二次启动时改回embedded即可。
如果不需要定时任务的持久化就可以不管。
写一个测试用的任务类
java复制代码import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
@Component
public class QuartzTestJob extends QuartzJobBean {
@Override
protected void executeInternal(org.quartz.JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("Quartz Test Job");
}
}
为这个任务类写一个配置类
java复制代码
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzTestJobConfig {
@Bean
public JobDetail quartzTestJobDetail() {
return JobBuilder.newJob(QuartzTestJob.class)
.withIdentity(QuartzTestJob.class.getSimpleName())
.storeDurably()
.usingJobData("data", "test")
.build();
}
@Bean
public Trigger quartzTestJobTrigger() {
// 0/1 * * * * ?
return TriggerBuilder.newTrigger()
.forJob(QuartzTestJob.class.getSimpleName())
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
.build();
}
}
结论
以上是使用Quartz写一个定时任务的步骤,很简单,问题是配置写死了,没有办法动态调整,所以我们开始写接口,把上面这个任务配置类去掉。
定时任务动态配置实现
我们还是用上面的任务类QuartzTestJob做测试,这里再说明一次,我们需要有一个任务类作为基础,本文的目的只是去掉上面的QuartzTestJobConfig。
剩下的内容没有什么需要多说明的,我直接贴代码了。
业务层
java复制代码public interface QuartzService {
/**
* 添加定时任务
*/
void addJob(QuartzCreateParam param) throws SchedulerException;
/**
* 修改定时任务
*/
void updateJob(QuartzUpdateParam param) throws SchedulerException;
/**
* 暂停定时任务
*/
void pauseJob(QuartzDetailParam param) throws SchedulerException;
/**
* 恢复定时任务
*/
void resumeJob(QuartzDetailParam param) throws SchedulerException;
/**
* 删除定时任务
*/
void deleteJob(QuartzDetailParam param) throws Sc