前端时间由于工作需要研究了下QUARTZ这个调度器,在网上看了蛮多的资料,其中说 的最少最不明白的就是关于QUARTZ的有状态和无状态的 JOB,QUARTZ是怎么处理的,网友们基本上都是说有状态的JOB时,当这次任务没有完成,而下次触发的时间又来了时,都认为是挂起,等待,要考虑很 复杂的情况,本人看了QUARTZ的源码的实现方案,现将QUARTZ的实现机制描述如下:
QUARTZ的有状态的JOB始终只有一个任务在运行,不会出现同一个JOB并发的情况,QUARTZ执行一个JOB时,会判断该JOB是不是有 状态的,如果是有状态的,则把给JOB从存储JOB的列表中移除,保存到另一个集合里,当然要修改该JOB的状态,等到该JOB运行完成时,再把该JOB 从集合里删除,重新加入到JOB列表中,这样的话,QUARTZ就不怕由于这个JOB运行太长的时间,而导致下次运行时间到达时又触发了该JOB,因为该 JOB已经不在JOB列表[b][/b]中了,找不到触发器对应的JOB,只能返回空的JOB ,就直接返回了。不会出现任何的等待挂起问题。假如说一个JOB运行了执行的时间很长,而错过了N次触发,侧等到该JOB运行完,则下次触发的时间是 (N+1)*每次触发的时间。
QUARTZ的有状态的JOB始终只有一个任务在运行,不会出现同一个JOB并发的情况,QUARTZ执行一个JOB时,会判断该JOB是不是有 状态的,如果是有状态的,则把给JOB从存储JOB的列表中移除,保存到另一个集合里,当然要修改该JOB的状态,等到该JOB运行完成时,再把该JOB 从集合里删除,重新加入到JOB列表中,这样的话,QUARTZ就不怕由于这个JOB运行太长的时间,而导致下次运行时间到达时又触发了该JOB,因为该 JOB已经不在JOB列表[b][/b]中了,找不到触发器对应的JOB,只能返回空的JOB ,就直接返回了。不会出现任何的等待挂起问题。假如说一个JOB运行了执行的时间很长,而错过了N次触发,侧等到该JOB运行完,则下次触发的时间是 (N+1)*每次触发的时间。