内存存储
1,启动类开启定时任务
package com.lgs.code;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import tk.mybatis.spring.annotation.MapperScan;
/**
* @author lgs
*/
@SpringBootApplication
//EnableScheduling 开启定时任务
@EnableScheduling
public class Quartz02Application {
public static void main(String[] args) {
SpringApplication.run(Quartz02Application.class, args);
}
}
2,创建任务类MyJob
package com.lgs.code.job;
import com.lgs.code.util.MyJobFactory;
import org.apache.commons.logging.Log;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Map;
/**
* @author lgs
* 任务类
*/
public class MyJob implements Job {
@Autowired
MyJobFactory factory;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
Map data = context.getJobDetail().getJobDataMap();
System.out.println(data.get("name")+"在"+data.get("loc")+"搞卫生");
}
}
3,text
package com.lgs.code;
import com.lgs.code.job.MyJob;
import org.junit.jupiter.api.Test;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.scheduling.annotation.Scheduled;
import java.util.Date;
import static org.quartz.JobBuilder.newJob;
@SpringBootTest
class Quartz02ApplicationTests {
@Test
void contextLoads() throws Exception{
// 1,实例化调度器工厂
SchedulerFactory factory = new StdSchedulerFactory();
// 2,得到调度器
Scheduler scheduler = factory.getScheduler();
// 3,创建任务
// Job(模板) 和 JobDetail(实例)
JobDetail jobDetail01 = newJob(MyJob.class)
.withDescription("大扫除任务") //描述
.withIdentity("a", "b") //任务id => ab
.usingJobData("name","张三")
.usingJobData("loc","阁-楼")
.build(); //构建
jobDetail01.getJobDataMap().put("name","张三");
jobDetail01.getJobDataMap().put("loc","阁-楼");
// 4,创建触发器
Trigger trigger = TriggerBuilder.newTrigger()
.withDescription("创建触发器")
.withIdentity("b", "c") // bc
.withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
.build();
// 5,将触发器和任务绑定到调度器
scheduler.scheduleJob(jobDetail01,trigger);
// 6,启动调度器
scheduler.start();
while (true){}
}
}
数据库存储
1,创建模块:
2,下载 quartz调度框架 Quartz Enterprise Job Scheduler
下载之后运行SQL脚本
quartz-2.2.2-distribution->quartz-2.2.2->docs->dbTables->tables_mysql.sql
表quartz自己管理,不需要我们维护,如下是需要用到的表
qrtz_cron_triggers、qrtz_job_details、qrtz_triggers
我们把需要的定时任务交给quartz,quartz把任务放到对应表中,我们不修改quartz的内置表,新建两张任务表
任务表:
create table t_schedule_trigger
(
id bigint primary key auto_increment comment '触发器编号',
cron varchar(200) not null comment '触发器表达式',
status char(1) not null comment '触发器状态: 禁用0 启用1',
job_name varchar(200) not null comment '任务名称: 存放的任务类的全路径',
job_group varchar(200) not null comment '任务所处分组',
job_description varchar(200) not null comment '任务描述',
trigger_description varchar(200) not null comment '触发器描述',
unique index (job_name, job_group) comment '通过jobName和jobGroup来确定trigger的唯一性,所以这两列为联合唯一索引'
);
任务所需数据表:
create table t_schedule_trigger_data
(
id bigint primary key auto_increment comment '数据编号',
name varchar(200) not null comment '对应的数据名称',
value varchar(512) comment '对应的数据值',
trigger_id bigint not null comment '外键: 引用t_schedule_trigger(id)',
foreign key (trigger_id) references t_schedule_trigger (id)
);
在t_schedule_trigger增加一个任务:
在t_schedule_trigger_data中建t_schedule_trigger表中任务数据:
目标:
程序启动后把我们所建表的数据读出来让quartz放到quartz所管理的表中去
任务表中有禁用和启动,当我们禁用时quartz需要把quartz所管理的表中的数据去除
3、准备需要的工具和依赖
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>
<groupId>com.lgs</groupId>
<artifactId>code</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>quartz_02</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.4.1</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifa