一.常用名词理解(利用绿皮火车上下车来说明)
scheduler 调度员,相当于每节车厢的乘务员,他会在你上车的时候收你的票登记,然后到站的时候叫你下车
trigger 扳机,相当于车票上的登记你在哪站下车的时机,车票必须交给调度员登记,他才能通知你下车,trigger在构造对象的时候会和jobdetail形成绑定
job 工作,相当于你到站下车这一动作,你只能在登记的时间下车,不然你就是逃票或者浪费运力资源
jobDetail 相当于你的行李,你会携带一些行李,下车之前你必须把你的行李收拾好然后一起带下车,整理行李发生在乘务员叫你下车和你下车之间。
jobData 你行李中的一张纸条,有且只能有一张,上面有一条你下车需知的信息
jobDataMap 你行李中的一本书,有且只能有一本,和jobData两个默认只能存在一个,记载了大量的信息
jobBuilder 他会通过job的class文件构造一个jobDetail,这样就形成了job和jobdetail的绑定
注:为什么不直接使用属性而使用jobData来登记属性
答:我也不知道,别问为什么我不知道,因为我菜,我猜可能是链式编程一路编到底看起来比较牛逼吧。
二.简单实战实例
(1)依赖的jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
(2)job类//job和jobDetail是互相依存的
/**
* 定时任务业务处理类,我们继承QuartzJobBean
* 重写executeInternal方法来实现具体的定时业务逻辑
*/
public class PrintTimeJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
//获取JobDetail中关联的数据
String msg = (String) context.getJobDetail().getJobDataMap().get("msg");
System.out.println("current time :"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "---" + msg);
//打印当前时间
}
}
(3)jobDetail和trigger//因为都是配置,所以一般写到同一个类中
@Configuration
public class QuartzConfig {
@Bean
public JobDetail newJob(){//通过jobBuilder来创建jobDetail
return JobBuilder.newJob(PrintTimeJob.class)//PrintTimeJob是我们的业务类//在这里形成了job和jobDetail的绑定
.withIdentity("9527")//可以给该JobDetail起一个id//因为创建job是通过jobDetail来创建的所以他来难过的名字是一样的
//每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中可以通过context获取
.usingJobData("msg", "Hello Quartz")//关联键值对//只定义了一对属性,所以使用jobData
.storeDurably()//即使没有Trigger关联时,也不需要删除该JobDetail
.build();//构造器模式,创建的就是一个jobDetail
}
@Bean
public Trigger printTimeJobTrigger() {//触发器trigger
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ? ");//一秒执行一次
return TriggerBuilder.newTrigger()
.forJob(newJob())//关联上述的JobDetail//实际上关联的是上面的newJob方法
.withIdentity("quartzTaskService")//给Trigger起个名字
.withSchedule(cronScheduleBuilder)//关联Schedule
.build();
}
}
然后我们直接通过APP.java来启动springboot启动完成后由于trigger是配置类就会指定开始执行job如下图