我认为,quartz简单来说就是三部分:任务(jobdetail)、触发器(trigger)、调度器(scheduler),结构如图:
jobdetail | trigger | scheduler |
---|---|---|
JobBuilder创建 | TriggerBuilder创建 | SchedulerFactory创建 |
组成:个人觉得jobdetail是由四部分组成的:名字、分组、job的class、JobDataMap(usingJobData)。
job的class: job就是具体需要定时执行的类,需要这个类实现Job这个接口。
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("Hello World");
}
}
名字和分组:顾名思义就是这个jobdetail的名字和属于哪个组(个人感觉这个没什么用,写着开心就好)。
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
//名字和组
.withIdentity("job1", "group1")
.build();
JobDataMap(usingJobData): 给执行的job传递参数,然后在job具体实现类中获取参数值,进行业务操作。
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1", "group1")
/**
* 可传入的值类型有:Integer,Float,Double,Boolean,Stirng
*/
//在jobdetail中传入参数值---String
.usingJobData("ceshi", "aa")
//在jobdetail中传入参数值---float
.usingJobData("float", 3.14F)
.build();
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
String ceshi = jobDataMap.getString("ceshi");
//浮点类型
float f = jobDataMap.getFloat("float");
System.out.println(f);
System.out.println(ceshi);
}
简介:这个东西个人理解就是规定什么时候去执行指定的job实现类。
分类:主要有SimpleTrigger和CronTrigger两个实现类。
、
组成: 名字、分组、ScheduleBuilder、JobDataMap(usingJobData)。
名字和分组: 这个东西和jobdetail一样,没什么区别。
JobDataMap(usingJobData): 内容是和jobdetail没什么区别的,注意:两者都存入相同的key,但是value不同的话,trigger会将jobdetail的value覆盖。(前提是在job的具体实现类中使用的是JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();
)
JobDataMap jobDataMap2 = jobExecutionContext.getMergedJobDataMap();
String ceshiz = jobDataMap2.getString("ceshi");
//这里就体现了覆盖:jobdetail和trigger都有ceshi这个参数,但是这里获取的就是trigger中赋值的那个
System.out.println(ceshiz);
JobDataMap通过get-set方法: 其实JobDataMap是可以通过set赋值的,前提是job的具体实现类需要有成员变量,而且提供get-set方法。
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1", "group1")
.usingJobData("name", "小明")
.usingJobData("age", "20")
.build();
public class HelloJob implements Job {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(name);
System.out.println(age);
}
}
ScheduleBuilder: 个人对这个东西的理解就是使用哪种形式的触发,和trigger的分类一样,常用的也有两种;SimpleScheduleBuilder和CronScheduleBuilder。相对来说SimpleScheduleBuilder比较简单,差不多就是隔多久触发一次,但是没法设置具体什么时候触发;CronScheduleBuilder比较复杂,但是灵活,需要用cron表达式,在项目中通常使用的就是CronScheduleBuilder。
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
//withIntervalInSeconds中的值必须是0或者正整数(单位是秒) - - 不然会报错
//每两秒触发一次
.withIntervalInSeconds(2)
//SimpleTrigger.REPEAT_INDEFINITELY:表示永远执行
.withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)
)
.startAt(startdate)
.build();
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(
//使用cron表达式,http://cron.qqe2.com/
CronScheduleBuilder.cronSchedule("* 18 21 * * ?")
)
.build();
简介: 官方术语叫做调度器,个人理解为读取trigger触发机制,然后告诉job的具体实现类什么时候执行任务。
两种创建方式: StdSchedulerFactory和DirectSchedulerFactory,一般都用StdSchedulerFactory创建。
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
DirectSchedulerFactory schedulerFactory1 = DirectSchedulerFactory.getInstance();
Scheduler scheduler1=schedulerFactory1.getScheduler();
组成: jobdetail和trigger
scheduler.scheduleJob(jobDetail, trigger);
//启动任务调度
scheduler.start();
其他函数: start(开始)、standby(挂起)、shutdown(关闭)、isShutdown(判断是否关闭)。个人觉得没什么意思,可以参考:https://github.com/mzd123/quartz_base/blob/master/src/p6_Scheduler/HelloScheduler.java
注意: scheduler.scheduleJob(jobDetail, trigger);的返回值是下次要执行的时间