一、定时任务含义
二、搭建项目
1、新建模块
2、导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
3、Scheduled(调度器)创建定时任务
在SpringBoot的启动类(Quartz01Application)类中加⼊ @EnableScheduling 注解,启⽤定时任务的配置
4、创建执行类
package com.lv.code;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
@Slf4j
public class Task {
@Scheduled(fixedRate = 1000)
public void test(){
log.warn("现在时间:" + LocalDateTime.now());
}
}
5、测试
每秒执行一次:
package com.lv.code;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Quartz01ApplicationTests {
@Test
void contextLoads() {
while (true){
}
}
}
6、Scheduled参数
cron表达式
cron表达式是一个字符串,以5或者6个空格隔开(示例中是被5个空格隔开),字符串被切割为6个或者7个域,每个域都代表不同的含义
注:日与星期不能同时出现,会矛盾,可以其中一个填?
星期里,1表示的是星期天,2表示的是星期一,以此类推,7表示的是星期六
?只存在于某天或某星期中,且不能同时存在(还不支持同时指定某天和星期)
'L'和'W'字符也可以在日期字段中组合以产生'LW',这转换为“最后一个工作日”
法定字符以及月份和星期的名称不区分大小写,如MON 与mon相同
每个域都可以用数字表示,还可以出现如下特殊字符
例子:
二、Quartz集成
1、Quartz创建定时任务
两种任务存储方式:这期内容讲解的是内存方式
2、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
3、测试类
Quartz01ApplicationTests:
package com.lv.code;
import org.junit.jupiter.api.Test;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
@SpringBootTest
class Quartz01ApplicationTests {
@Test
void contextLoads() throws Exception{
// 1、实例化调度器工厂
SchedulerFactory factory=new StdSchedulerFactory();
// 2、得到调度器
Scheduler scheduler = factory.getScheduler();
// 3、创建任务 newJob为静态方法,按住Alt+Enter,选择导入static方法
JobDetail jobDetail = newJob(MyJob.class)
// 描述
.withDescription("开年大扫除")
// 定义任务的主键:context.getJobDetail().getKey() = name + group,在同样的分组不能出现相同的名字,不同的名字则可以
.withIdentity("大扫除", "厕所")
.usingJobData("name", "王阿姨")
// 同样可以用集合
// JobDataMap jobDataMap=jobDetail.getJobDataMap();
// jobDataMap.put("name","xx");
// 构建出来,一定要写
.build();
// 4、创建触发器
Trigger trigger = TriggerBuilder.newTrigger()
.withDescription("大扫除触发器")
.withIdentity("大扫除", "厕所")
.startAt(new Date())
// .withSchedule(
// simpleSchedule()
// .withIntervalInSeconds(10)
重复次数
// .withRepeatCount(10) //SimpleTrigger.REPEAT_INDEFINITELY
// )
// 基于 Cron 表达式的触发器 CronTrigger
.withSchedule(
CronScheduleBuilder.cronSchedule("* * * * * ?")
)
.build();
// 5、将触发器和任务绑定到调度器
scheduler.scheduleJob(jobDetail, trigger);
// 6、启动调度器
scheduler.start();
}
}
4、Job 定时任务
新建Task 类:
package com.lv.code;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
@Slf4j
public class Task {
@Scheduled(cron = "10 10 * * * ?")
public void test(){
log.warn("现在时间:" + LocalDateTime.now());
}
}
5、测试结果