`
yimeng528
  • 浏览: 183857 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第六节:Quzrtz JobStore

阅读更多

第六节:JobStore

 

跟据名称的意思,很可能理解成存放作业的容器,实际上真不是这样,它放的有哪些东东呢?

JobStore我只看了RAMJobStore里面其实放了JobTrigger以及它们之间的关系。

 

让我们先看下有哪些jobStore吧,如下面类图:

 

其实也就是两类,一个是内存中,一个持久化存储.

 

RAMJobStore:

RAMJobStore继承至IJobStore接口,里面有几个需要了解到方法,如下:

 

//------------------job的操作---------------------------

//Job存储到内存中的方法, IJobDetail是作业详细信息

void StoreJob(IJobDetailnewJob,bool replaceExisting);

//移除job的方法,JobKey唯一标识一个job,相当于主键

bool RemoveJob(JobKeyjobKey);

bool RemoveJobs(IList<JobKey> jobKeys);

//得到作业的方法

IJobDetail RetrieveJob(JobKeyjobKey);

//检查作业是否存在

bool CheckExists(JobKeyjobKey);

 

 

 

//------------------Trigger的操作---------------------------

//把触发器存储到内存中的方法

void StoreTrigger(IOperableTriggernewTrigger,bool replaceExisting);

//移除触发器的方法

bool RemoveTrigger(TriggerKeytriggerKey);

bool RemoveTriggers(IList<TriggerKey> triggerKeys);

//检索触发器

IOperableTrigger RetrieveTrigger(TriggerKeytriggerKey);

//检查是否存在

bool CheckExists(JobKeyjobKey);

 

 

//请求下一个要触发的触发器

IList<IOperableTrigger>AcquireNextTriggers(DateTimeOffsetnoLaterThan,int maxCount,TimeSpantimeWindow);

 

调度器会通过适当的时机向RAMJobStore中添加触发器和作业,然后由QuartzSchedulerThread这个线程类去实时的获取下一个时间点要触发的触发器,然后执行触发器相关联的作业,这些代码基本上都在QuartzSchedulerThread类中的Run方法里面。

 

最后得到要执行的job是由JobRunShell类在线程池中执行完成的,如果想要在线程池中执行,必须继承IThreadRunnable接口,实现Run方法,JobRunShell就是如此。

 

 

结语RAMJobStore其实就是对作业和触发器做了一次聚合,把它们存储到内存中,由调度线程去请求要执行的触发器,然后找到相联的作业去完成执行。我们也可以理解成它就是对作业和触发器的管理维护,由调度器来操作的一个存储的东东。

 

内部的代码写的还是比较复杂的,主要是对几Dictionary的操作,有兴趣的朋友可以看下。

分享到:
评论
1 楼 谷超 2013-08-07  
楼主,如何把job信息持久化到数据库中呢?我试着把job信息持久化到mysql中,没有成功。
1、在数据库中执行对应的sql脚本
2、修改quartz.properties文件如下
org.quartz.jobStore.class= org.quartz.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval=15000

##config database
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc\:mysql\://localhost\:3306/myhibernate?useUnicode\=true&characterEncoding\=utf8
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password = mysql
org.quartz.dataSource.myDS.maxConnections = 5
3、客户端代码
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
System.out.println("----------------Initialization Complete------------------");

// 下一分钟整点时间
Date runTime = DateBuilder.evenMinuteDate(new Date());
System.out.println(runTime);

JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();

scheduler.scheduleJob(job, trigger);
System.out.println(job.getKey() + " will run at:" + runTime);

scheduler.start();

job能够正确执行,但是数据库对应表并没有增加相应记录。为什么增加记录呢?

相关推荐

Global site tag (gtag.js) - Google Analytics