參考資料
第一篇配合第二篇閱讀,講解一些基本概念。若已瞭解可跳過。
推薦閱讀第三篇,因爲本文是基於第三篇的筆記。
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);
}
}