您的位置:首页 > 其它

Quartzs的 job,trigger 存储、job,trigger 删除源码分析

2017-10-29 00:00 459 查看
摘要: Quartzs的 job,trigger 存储、job,trigger 删除源码分析

QuartzScheduler.java
public Date scheduleJob(JobDetail jobDetail,
Trigger trigger) throws SchedulerException {
validateState();

if (jobDetail == null) {
throw new SchedulerException("JobDetail cannot be null");
}

if (trigger == null) {
throw new SchedulerException("Trigger cannot be null");
}

if (jobDetail.getKey() == null) {
throw new SchedulerException("Job's key cannot be null");
}

if (jobDetail.getJobClass() == null) {
throw new SchedulerException("Job's class cannot be null");
}

OperableTrigger trig = (OperableTrigger)trigger;

if (trigger.getJobKey() == null) {
trig.setJobKey(jobDetail.getKey());
} else if (!trigger.getJobKey().equals(jobDetail.getKey())) {
throw new SchedulerException(
"Trigger does not reference given job!");
}
//校验trigger的合法性 调用间隔时间和调用次数的校验
trig.validate();

Calendar cal = null;
if (trigger.getCalendarName() != null) {
cal = resources.getJobStore().retrieveCalendar(trigger.getCalendarName());
}
//获取下一次调度时间
Date ft = trig.computeFirstFireTime(cal);

if (ft == null) {
throw new SchedulerException(
"Based on configured schedule, the given trigger '" + trigger.getKey() + "' will never fire.");
}
//默认RAMJobStore 中存储JobDetail 和 trigger实体 下面来看源码
resources.getJobStore().storeJobAndTrigger(jobDetail, trig);
//通知监听器
notifySchedulerListenersJobAdded(jobDetail);
//通知Job执行线程
notifySchedulerThread(trigger.getNextFireTime().getTime());
//通知调度监听器
notifySchedulerListenersSchduled(trigger);

return ft;
}


RAMJobStore.java
//将Job 和 Trigger 信息添加到RAMJobStore中
public void storeJobAndTrigger(JobDetail newJob,
OperableTrigger newTrigger) throws JobPersistenceException {
storeJob(newJob, false);
storeTrigger(newTrigger, false);
}

public void storeJob(JobDetail newJob,
boolean replaceExisting) throws ObjectAlreadyExistsException {
//封装Job信息 到 JobWrapper
JobWrapper jw = new JobWrapper((JobDetail)newJob.clone());

boolean repl = false;

synchronized (lock) {
if (jobsByKey.get(jw.key) != null) {
if (!replaceExisting) {//如果jobByKey中有该JobKey并且又不覆盖已经存在的Job 就抛异常
throw new ObjectAlreadyExistsException(newJob);
}
repl = true;
}

if (!repl) {//在 jobsByGroup , jobsByKey 中添加Job信息
// get job group
HashMap<JobKey, JobWrapper> grpMap = jobsByGroup.get(newJob.getKey().getGroup());
if (grpMap == null) {
grpMap = new HashMap<JobKey, JobWrapper>(100);
jobsByGroup.put(newJob.getKey().getGroup(), grpMap);
}
// add to jobs by group
grpMap.put(newJob.getKey(), jw);
// add to jobs by FQN map
jobsByKey.put(jw.key, jw);
} else {
// update job detail
JobWrapper orig = jobsByKey.get(jw.key);
orig.jobDetail = jw.jobDetail; // already cloned
}
}
}

public void storeTrigger(OperableTrigger newTrigger,
boolean replaceExisting) throws JobPersistenceException {
//将trigger封装为TriggerWrapper
TriggerWrapper tw = new TriggerWrapper((OperableTrigger)newTrigger.clone());

synchronized (lock) {
if (triggersByKey.get(tw.key) != null) {
if (!replaceExisting) {//如果triggersByKey中存在该TriggerKey 并且不替换已经存在的Trigger信息则抛异常。
throw new ObjectAlreadyExistsException(newTrigger);
}
//triggersByKey triggersByGroup triggers timeTriggers  移除已经存在的Trigger信息 ------并且不移除jobsByKey jobsByGroup中的Job信息
removeTrigger(newTrigger.getKey(), false);
}
//jobsByKey中是否有该任务(JobKey)
if (retrieveJob(newTrigger.getJobKey()) == null) {
throw new JobPersistenceException("The job ("
+ newTrigger.getJobKey()
+ ") referenced by the trigger does not exist.");
}
// add to triggers array
triggers.add(tw);
// add to triggers by group
HashMap<TriggerKey, TriggerWrapper> grpMap = triggersByGroup.get(newTrigger.getKey().getGroup());
if (grpMap == null) {
grpMap = new HashMap<TriggerKey, TriggerWrapper>(100);
triggersByGroup.put(newTrigger.getKey().getGroup(), grpMap);
}
grpMap.put(newTrigger.getKey(), tw);
// add to triggers by FQN map
triggersByKey.put(tw.key, tw);

if (pausedTriggerGroups.contains(newTrigger.getKey().getGroup())
|| pausedJobGroups.contains(newTrigger.getJobKey().getGroup())) {
tw.state = TriggerWrapper.STATE_PAUSED;
if (blockedJobs.contains(tw.jobKey)) {
tw.state = TriggerWrapper.STATE_PAUSED_BLOCKED;
}
} else if (blockedJobs.contains(tw.jobKey)) {
tw.state = TriggerWrapper.STATE_BLOCKED;
} else {
timeTriggers.add(tw);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Quartz2