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); } } }
相关文章推荐
- quartz源码分析之深刻理解job,sheduler,calendar,trigger及listener之间的关系
- Quartz源码分析之Job
- Quartzs的job,trriger监听器源码分析
- Quartz源码——JobStore保存JonDetail和Trigger源码分析(一)
- Quartz源码——JobStore保存JonDetail和Trigger源码分析(一)
- Quartz源码分析之Trigger
- Raw-OS源码分析之任务删除与总结
- quartz源码分析
- Quartz教程二--API、Job与Trigger
- JobContext源码分析
- MapReduce job在JobTracker初始化源码级分析
- quartz2.x源码分析——启动过程
- 电影网站增删改查-6 spring boots/MVC/neo4j/thymeleaf 源码分析 电影删除
- 【转载】存储分析 开源重复数据删除技术崭露头角
- memcached学习笔记——存储命令源码分析下篇
- Hadoop源码分析23:MapReduce的Job提交过程
- Mybatis源码分析之存储过程调用和运行流程
- Quartz教程二:API,Job和Trigger
- docker 源码分析 四(基于1.8.2版本),Docker镜像的获取和存储
- Quartz源码——scheduler.start()启动源码分析(二)