Quartz 的使用思路
1)job - 任务 - 你要做什么事?
2)Trigger - 触发器 - 你什么时候去做?
3)Scheduler - 任务调度 - 你什么时候需要去做什么事?
1.创建springboot项目,修改 pom 文件添加三个坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xmx</groupId>
<artifactId>scheduleddemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>scheduleddemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 添加 Scheduled 坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- Quartz 坐标 --><dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<!-- Sprng tx 坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.编写定时任务类
package com.xmx.scheduleddemo;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
/* 定时任务,需要继承Job类*/
public class QuartzDemo implements Job {
//重写Job父类的方法,定时要执行的任务代码写在此方法中。
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//定时任务,并输出加载的信息
System.out.println("定时器被触发"+sdf.format(new Date())+
context.getMergedJobDataMap().getString("msg"));
}
}
3.编写工作计划类
package com.xmx.scheduleddemo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
import java.util.Objects;
/**
* Quartz配置类 创建JobDetail对象 Trigger对象 Scheduler对象
*/
@Configuration
public class QuartzConfig {
/**
* 1.创建 Job 对象
*/
@Bean
public JobDetailFactoryBean jobDetailFactoryBean() {
// 关联我们自己的 Job 类
JobDetailFactoryBean factory = new JobDetailFactoryBean();
factory.setJobClass(QuartzDemo.class);
// 可以添加一些信息,在Job类中可以取
factory.getJobDataMap().put("msg", "湖南新梦想");
return factory;
}
/**
* 2.1创建 Trigger 对象 简单的 Trigger
*/
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
// 关联JobDetail 对象
factory.setJobDetail(jobDetailFactoryBean.getObject());
// 该参数表示一个执行的毫秒数
factory.setRepeatInterval(2000);
// 重复次数
factory.setRepeatCount(5);
return factory;
}
/**
* 2.2 另一个策略配置 配置执行策略对象
*
* @param jobDetailFactoryBean
* @return
*/
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
CronTriggerFactoryBean factory = new CronTriggerFactoryBean();
factory.setJobDetail(Objects.requireNonNull(jobDetailFactoryBean.getObject()));
// 设置触发时间
factory.setCronExpression("0/6 * * * * ?");
return factory;
}
/**
* 3.创建 Scheduler 对象
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean trigger) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setStartupDelay(1);
// 关联 trigger
factory.setTriggers(trigger.getObject());
return factory;
}
}
4.运行结果(每隔6秒执行 )
5.另一种方式配置
@Bean
public JobDetail printTimeJobDetail() {
return JobBuilder.newJob(QuartzDemo.class)// PrintTimeJob我们的业务类
.withIdentity("QuartzDemo")// 可以给该JobDetail起一个id
// 每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中可以通过context获取
.usingJobData("msg", "Hello Quartz")// 关联键值对
.storeDurably() // 即使没有Trigger关联时,也不需要删除该JobDetail
.build();
}
@Bean
public Trigger printTimeJobTrigger() {
CronScheduleBuilder cronScheduleBuilder = //
CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
return TriggerBuilder.newTrigger(). //
forJob(printTimeJobDetail())
// 关联上述的JobDetail //
.withIdentity("quartzTaskService") // 给Trigger起个名字
.withSchedule(cronScheduleBuilder) //
.build();
}