我是靠谱客的博主 超帅月饼,这篇文章主要介绍quartz原理分析2----job和trigger的存储,现在分享给大家,希望可以做个参考。

    对于数据库模式的调度任务,job和trigger需要被存储到数据库中。当服务器再次启动的时候调度任务可以继续执行。

    下面分析任务的存储代码。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static void main(String[] args) throws SchedulerException { SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = sf.getScheduler(); scheduler.pauseJob(JobKey.jobKey("ramJob", "ramGroup")); scheduler.pauseTrigger(TriggerKey.triggerKey("ramTrigger", "ramTriggerGroup")); scheduler.unscheduleJob(TriggerKey.triggerKey("ramTrigger", "ramTriggerGroup")); scheduler.deleteJob(JobKey.jobKey("ramJob", "ramGroup")); //job JobDetail jb = JobBuilder.newJob(RamJob.class).withDescription("description:ram job") .withIdentity("ramJob", "ramGroup").build(); //trigger Trigger trigger = TriggerBuilder.newTrigger().withDescription("ram trigger") .withIdentity("ramTrigger", "ramTriggerGroup").startAt(new Date(System.currentTimeMillis() + 3 * 1000)) .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build(); //包含存储操作 scheduler.scheduleJob(jb, trigger); scheduler.start(); }

    Schedule.scheduleJob方法执行存储操作。

复制代码
1
2
3
4
public Date scheduleJob(JobDetail jobDetail, Trigger trigger) throws SchedulerException { return sched.scheduleJob(jobDetail, trigger); }

    sched是 QuartzScheduler实例,包含存储job和trigger的方法。 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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!"); } 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."); } resources.getJobStore().storeJobAndTrigger(jobDetail, trig); notifySchedulerListenersJobAdded(jobDetail); notifySchedulerThread(trigger.getNextFireTime().getTime()); notifySchedulerListenersSchduled(trigger); return ft; }

     resources.getJobStore().storeJobAndTrigger(jobDetail, trig);是执行存储的语句。 

    resources是QuartzSchedulerResources的实例,此类中包含JobStore的实例,JobStore是专门用于存储job和trigger对象的接口。此处使用JobStoreSupport中的方法。JobStoreSupport实现了JobStore接口。 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
public void storeJobAndTrigger(final JobDetail newJob, final OperableTrigger newTrigger) throws JobPersistenceException { executeInLock( (isLockOnInsert()) ? LOCK_TRIGGER_ACCESS : null, new VoidTransactionCallback() { public void executeVoid(Connection conn) throws JobPersistenceException { storeJob(conn, newJob, false); storeTrigger(conn, newTrigger, newJob, false, Constants.STATE_WAITING, false, false); } }); }

   storeJob 和 storeTrigger方法使用sql语句插入任务信息。此处不再列出代码。

最后

以上就是超帅月饼最近收集整理的关于quartz原理分析2----job和trigger的存储的全部内容,更多相关quartz原理分析2----job和trigger内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部