一句话概括
对于已经超过5s以上时间的任务,会根据任务配置的调度过期策略来选择要不要执行,要么忽略要么立即执行,就这两种
配置任务的调度过期策略
有2种
1.忽略
2.立即执行一次
如何配置?
对应的枚举类
public enum MisfireStrategyEnum {
/**
* do nothing 啥都不做
*/
DO_NOTHING(I18nUtil.getString("misfire_strategy_do_nothing")),
/**
* fire once now 立即触发
*/
FIRE_ONCE_NOW(I18nUtil.getString("misfire_strategy_fire_once_now"));
}
在哪里使用到调度过期策略
对于已经超时5s还未执行的任务,才会根据任务配置的调度过期策略来选择要不要执行
底层源码
JobScheduleHelper.start()
if (nowTime > jobInfo.getTriggerNextTime() + PRE_READ_MS) {
// 距离该任务的触发时间已经超过5s了
// 获取该任务的调度过期策略
MisfireStrategyEnum misfireStrategyEnum = MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING);
if (MisfireStrategyEnum.FIRE_ONCE_NOW == misfireStrategyEnum) { // 立即执行
// FIRE_ONCE_NOW 》 trigger 调度过期策略:立即执行(交给快慢线程池去trigger)
JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, null, null);
} else {
// 直接忽略
}
// 2、fresh next 更新其下次触发时间
refreshNextValidTime(jobInfo, new Date());
}