第六节:JobStore
跟据名称的意思,很可能理解成存放作业的容器,实际上真不是这样,它放的有哪些东东呢?
JobStore我只看了RAMJobStore,里面其实放了Job和Trigger以及它们之间的关系。
让我们先看下有哪些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的操作,有兴趣的朋友可以看下。