Quartz技术原理

Quartz运行基本:

(1)       创建任务jobDetail(放入具体的jobImpl),触发器trigger(保存job的触发策略),均放入调度器scheduler。

(2)       执行scheduler.start()。

(3)       对于quartz.properties,要求较高的场景需要自定义配置,比如设置足够多的线程数。否则使用默认配置即可满足。

 

Schedule调度的线程,主要有2个:

(1)       常规调度线程:轮询存储的所有trigger,如有需要触发的trigger,即到了下一次触发的时间,则从任务执行线程池获取一个空闲线程,执行与该trigger关联的任务。

(2)       Misfire线程:扫描所有的trigger,查看是否有misfiredtrigger,如有,则根据misfire的策略分配处理(fire now OR wait for the next fire)。

 

Quartz的集群调度:

(1)       集群上的每一个节点,通过相同的数据库表来协调调度。DB中存有trigger表,并且每一个节点要查询trigger表时必须拿到锁。

(2)       当一个机子拿到trigger表锁,查询trigger表,如有要触发的trigger,则执行相应任务X,并修改此trigger的NEXT_FIRE_TIME字段,即下次执行时间。这样,当别的机子拿到锁,也查询trigger表,就不会再执行上一次trigger,因为trigger的NEXT_FIRE_TIME字段已经被修改,这样就实现了多个节点的应用在某一时刻对任务只进行一次调度。

posted @ 2017-05-11 20:02  邱进宝  阅读(407)  评论(0编辑  收藏  举报