主线程:QuartzSchedulerThread
1 获取trigger
next_fire_time时间范围:起始: 当前时间-misfireThreshold(60s), 终止:当前时间+idleWaitTime(30s)+timeWindow(0)
状态:waiting
批次大小:maxBatchSize(1)
排序:next_fire_time 增序,即一般取next_fire_time最小的那条
注意:若misfire_instr=-1(ignore),则不加起始时间判断,即ignore的trigger不管时间多早都由主线程处理
2 trigger状态由waiting改为acquired
注意:1和2有可能在加锁中完成,需配置开启(默认关闭,job开启了)或maxBatchSize>1
一般来说,不加锁也没多大问题,即便不同机器拿到同一trigger,只会有一台能从waiting改为acquired
但是极限情况下某台获取trigger到改状态之间,另外一台完成了waiting-acquired-waiting的改变,可能导致重复调用
3 加锁修改trigger状态为waiting和时间更新
prev_fire_time 设置为原next_fire_time, next_fire_time计算出来
4 执行任务:提交到线程池执行,job使用的是50线程的SimpleThreadPool
提交任务可能会一直等待直到线程池有空余线程
注意事项:
1 如果获取到的首个trigger还未到触发时间,quartz会等待,所以当maxBatchSize=1任务不会提前触发
但maxBatchSize>1, 有很可能导致任务提前触发,所以maxBatchSize>1+idleWaitTime设置小点+能容忍轻微的提前触发 也是一种组合
2 注意除了triggers表外,从调度开始到执行完成fired_triggers也会存在记录,记录有executing状态
misfire:针对next_fire_time在当前时间-misfireThreshold之前且状态为waiting的trigger进行处理
处理时机:MisfireHandler线程定时处理,启动时,resumeTrigger时
misfire_instr:
-1(ignore): 不处理,由主线程处理
0(smart,默认):CronTrigger中为1
CronTrigger: 1(fire_once_now):next_fire_time设置为当前时间,即会被立即触发一次
CronTrigger: 2(do_nothing, job为2):以当前时间为基准计算next_fire_time并设置
SimpleTrigger的数字暂时不列举



