1、quartz简介
1.1 它是一个由java编写的开源作业调度框架,为在java应用程序中进行了任务的调度也就是控制了什么时间去执行什么任务
1.2 实现了任务和触发器多对多的关系,也可以把多个任务和不同的触发器进行关联
2、quartz重要组件
2.1 job
2.1.1 job即工作,是一个接口所以当需要我们去做一个定时任务的时候就需要写一个类去实现这个job,然后实现里面的方法execute(JobExecutionContext jobExecutionContext) 在这个方法里面就可以写自己的方法
2.2 trigger
2.2.1 trigger触发器即时间触发器,告诉调度器schedule是什么时候来执行这个job里面由两个重要实现类CronTriggerImpl和SimpleTriggerImpl,CronTriggerImpl使用的场景较多因为他的功能相比较而言较为强大。这个时间就是传说中的cron表达式
生成cron表达式网站
2.2.2 触发器的通用属性
(1) JobKey:表示与这个trigger绑定的job任务实例的一个表示,当触发这个触发器的时候,与其绑定的job就会执行
(2) StartTime:表示这个触发器开始触发的时间
(3)EndTime:表示这个触发器接触的时间
2.3 schedule
3.1 schedule通常是由StdScheduleFactory和DirectSchedulerFactory创建
3.2 schedule调度器就相当与是一个容器需要来装Job和trigger进而去实现这个任务通过时间触发器来触发,二者皆不可少
3.3 schedule主要函数
3.3.1 scheduler.scheduleJob(jobDetail,trigger );
这个调度器需要执行的任务jobDetail在这个时间触发器指定的时间下trigger
3.3.2 void strat() 启动Scheduler
3.3.3 void standby() 将该Scheduler暂停
3.3.4 void shutdown() 将该Scheduler关闭,并且不能被重启。该方法可以有两个参数,如果为 shutdown(true) ,表示等待所有正在执行的Job执行完毕之后,再关闭scheduler;如果为 shutdown(false) ,默认不填也是这样,表示直接关闭scheduler
3、quartz应用场景
3.1 在我们需要进行定时备份数据,订单超时自动取消,按时间段进行数据的扫描等等
4、quartz示例代码
4.1 结构
4.2 pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--QuartzJobBean-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
</dependencies>
4.3 需要执行的任务
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
@Component
public class MyTask implements Job{
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// 这里就写自己的业务
System.out.println("定时任务执行了");
}
}
4.4 创建触发器和调度器统一由调度来进行封装
public void start(Long id) throws Exception {
try {
// 数据库查询
QuartzJob quartzJob = quartzJobMapper.selectById(id);
String cron = quartzJob.getCron();
CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(cron);
// 创建时间触发器
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withSchedule(cronSchedule)
.withIdentity("task_" + quartzJob.getId())
.startAt(new Date())
.build();
// 创建工作内容
JobDetail jobDetail = JobBuilder.newJob(MyTask.class).withIdentity("task_" + quartzJob.getId()).build();
// 创建调度器
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.scheduleJob(jobDetail,trigger );
// 开始运行
scheduler.start();