参考资料
第一篇配合第二篇阅读,讲解一些基本概念。若已了解可跳过。
推荐阅读第三篇,因为本文是基于第三篇的笔记。
DEMO
一个DEMO,每3秒输出helloworld
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap jobDataMap = context.getMergedJobDataMap();
String say = jobDataMap.getString("say");
System.out.println(say);
}
}
public class Demo {
public static void main(String[] args) {
JobDetail jd = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob","jobGroup1")
.withDescription("a demo jobDetail")
.usingJobData("say","helloworld")
.build(); //本文要讲的部分
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity("myCronTrigger","triggerGroup1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ?"))
.forJob(jd) //本文要讲的部分
.build(); //本文要讲的部分
try {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.scheduleJob(jd,cronTrigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
JobDetail实例的创建
我们比较一下JobDetailImpl和JobBuilder的成员变量
public class JobDetailImpl implements Cloneable, java.io.Serializable, JobDetail {
private static final long serialVersionUID = -6069784757781506897L;
private String name;
private String group = Scheduler.DEFAULT_GROUP;
private String description;
private Class<? extends Job> jobClass;
private JobDataMap jobDataMap;
private boolean durability = false;
private boolean shouldRecover = false;
private transient JobKey key = null;
}
public class JobBuilder {
private JobKey key;
private String description;
private Class<? extends Job> jobClass;
private boolean durability;
private boolean shouldRecover;
private JobDataMap jobDataMap = new JobDataMap();
JobDetail的创建是典型的builder模式。JobBuilder的成员变量和JobDetail相似。把想要的内容交给JobBuilder,JobBuilder在build()方法把对应成员赋给JobDetail。
- JobBuilder.buid()
public JobDetail build() {
JobDetailImpl job = new JobDetailImpl();
job.setJobClass(jobClass);
job.setDescription(description);
if(key == null)
key = new JobKey(Key.createUniqueName(null), null);
job.setKey(key);
job.setDurability(durability);
job.setRequestsRecovery(shouldRecover);
if(!jobDataMap.isEmpty())
job.setJobDataMap(jobDataMap);
return job;
}
Trigger实例的创建
和JobDetail类似,Trigger实例也是通过TriggerBuilder.build()获得,但Trigger实例并不是由TriggerBuilder自己创建,而是委托给成员scheduleBuilder创建。
- TriggerBuilder.build()
public T build() {
if(scheduleBuilder == null)
scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
MutableTrigger trig = scheduleBuilder.build(); //scheduleBuilder负责创建Trigger实例
trig.setCalendarName(calendarName);
trig.setDescription(description);
trig.setStartTime(startTime);
trig.setEndTime(endTime);
if(key == null)
key = new TriggerKey(Key.createUniqueName(null), null);
trig.setKey(key);
if(jobKey != null)
trig.setJobKey(jobKey);
trig.setPriority(priority);
if(!jobDataMap.isEmpty())
trig.setJobDataMap(jobDataMap);
return (T) trig;
}
ScheduleBuilder有多种具体实现,这里以CronScheduleBuilder为例。
- CronScheduleBuilder.build()
public MutableTrigger build() {
CronTriggerImpl ct = new CronTriggerImpl();
ct.setCronExpression(cronExpression);
ct.setTimeZone(cronExpression.getTimeZone());
ct.setMisfireInstruction(misfireInstruction);
return ct;
}
scheduleBuilder成员是怎么来的呢?是在TriggerBuilder设置触发时间的时候
- TriggerBuilder.withSchedule(ScheduleBuilder schedBuilder)
public <SBT extends T> TriggerBuilder<SBT> withSchedule(ScheduleBuilder<SBT> schedBuilder) {
this.scheduleBuilder = schedBuilder; //设置scheduleBuilder成员
return (TriggerBuilder<SBT>) this;
}
Trigger与JobDetail绑定
创建Trigger的时候可以指定对应的JobDetail
- TriggerBuilder.forJob(JobDetail jobDetail)
public TriggerBuilder<T> forJob(JobDetail jobDetail) {
JobKey k = jobDetail.getKey();
if(k.getName() == null)
throw new IllegalArgumentException("The given job has not yet had a name assigned to it.");
this.jobKey = k;
return this;
}
JobKey内容简单,操作由Key来实现
public final class JobKey extends Key<JobKey> {
private static final long serialVersionUID = -6073883950062574010L;
public JobKey(String name) {
super(name, null);
}
public JobKey(String name, String group) {
super(name, group);
}
public static JobKey jobKey(String name) {
return new JobKey(name, null);
}
public static JobKey jobKey(String name, String group) {
return new JobKey(name, group);
}
}