一、定时任务
在很多情况下任务并非需要立即执行 , 而是需要往后或定期执行 , 这不可能人工去操作 , 所以定时任务就出现了
1、Scheduled创建定时任务
①、在SpringBoot的启动类类中加⼊ @EnableScheduling 注解,启⽤定时任务的配置
②、创建定时任务实现类
package com.mwy.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 = 2000)
public void work() {
log.warn("现在时间:" + LocalDateTime.now());
}
}
测试:
测试类测试只能执行一次,使用死循环执行多次
二、Quartz创建定时任务
1、导入pom依赖
2、内存方式:
①、实例化调度器工厂:
StdSchedulerFactory:可读取配置文件
②、得到调度器
Scheduler 维护了一个 JobDetails(任务) 和 Triggers(触发时间) 的注册表
③、创建一个任务类MyJob,实现job接口成为一个任务,实现方法
任务是一个实现 org.quartz.Job 接口的类,任务类必须含有空构造器
当关联这个任务实例的触发器表明的执行时间到了的时候,调度程序 Scheduler 会调用这个方法来执行 任务,任务内容就可以在这个方法中执行
JobDataMap 提供了一种 “ 初始化成员属性数据的机制 ”, 在实现该 Job 接口的时候可以取到需要的数据
context.getJobDetail().getKey() = name + group
④、创建触发器
触发器使用 TriggerBuilder 来实例化,有一个 TriggerKey 关联,在一个 Scheduler 中必须是唯一的。
多个触发器可以指向同一个工作,但一个触发器只能指向一个工作。
触发器可以传送数据给 job ,通过将数据放进触发器的 JobDataMap 。
如果没有使用 withIdentity(..) 会自动生成一个触发器名称。
⑤、将触发器和任务绑定到调度器
⑥、启动调度器
⑦、测试结果
3、 job和jobDetail的区别
job是任务模板,jobDetail是实例
①、创建两个jobDetail实例 ,usingJobData不同
②、在任务模板中获取到name属性(MyJob)
package com.mwy.code;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
@Slf4j
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
Object name= context.getJobDetail().getJobDataMap().get("name");
log.warn(name+"写作业");
}
}
运行结果:
如果想要放入很多数据,可以用JobDataMap集合
③、设置时间以及执行次数
SimpleTrigger 特点:开始时间、结束时间、重复次数以及重复执行的时间间隔。
Cron生成器 : http://cron.ciding.cc/
基于 Cron 表达式的触发器 CronTrigger