|
|
|
@ -70,6 +70,7 @@ public class JobScheduleHelper {
|
|
|
|
|
connAutoCommit = conn.getAutoCommit();
|
|
|
|
|
conn.setAutoCommit(false);
|
|
|
|
|
|
|
|
|
|
//通过这个来控制多节点只有一个节点会执行 low的一笔
|
|
|
|
|
preparedStatement = conn.prepareStatement( "select * from xxl_job_lock where lock_name = 'schedule_lock' for update" );
|
|
|
|
|
preparedStatement.execute();
|
|
|
|
|
|
|
|
|
@ -77,18 +78,21 @@ public class JobScheduleHelper {
|
|
|
|
|
|
|
|
|
|
// 1、pre read
|
|
|
|
|
long nowTime = System.currentTimeMillis();
|
|
|
|
|
//下次执行时间 在5秒内的
|
|
|
|
|
List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount);
|
|
|
|
|
if (scheduleList!=null && scheduleList.size()>0) {
|
|
|
|
|
// 2、push time-ring
|
|
|
|
|
for (XxlJobInfo jobInfo: scheduleList) {
|
|
|
|
|
|
|
|
|
|
// time-ring jump
|
|
|
|
|
// 当前时间>下次执行时间+5秒 任务触发过期策略
|
|
|
|
|
if (nowTime > jobInfo.getTriggerNextTime() + PRE_READ_MS) {
|
|
|
|
|
// 2.1、trigger-expire > 5s:pass && make next-trigger-time
|
|
|
|
|
logger.warn(">>>>>>>>>>> xxl-job, schedule misfire, jobId = " + jobInfo.getId());
|
|
|
|
|
|
|
|
|
|
// 1、misfire match
|
|
|
|
|
MisfireStrategyEnum misfireStrategyEnum = MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING);
|
|
|
|
|
//如果过期策略是立即执行一次则 执行
|
|
|
|
|
if (MisfireStrategyEnum.FIRE_ONCE_NOW == misfireStrategyEnum) {
|
|
|
|
|
// FIRE_ONCE_NOW 》 trigger
|
|
|
|
|
JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, null, null);
|
|
|
|
@ -96,19 +100,25 @@ public class JobScheduleHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2、fresh next
|
|
|
|
|
//刷新下次执行时间
|
|
|
|
|
refreshNextValidTime(jobInfo, new Date());
|
|
|
|
|
|
|
|
|
|
} else if (nowTime > jobInfo.getTriggerNextTime()) {
|
|
|
|
|
}
|
|
|
|
|
//当前时间>下次执行时间 但是控制在5秒内
|
|
|
|
|
else if (nowTime > jobInfo.getTriggerNextTime()) {
|
|
|
|
|
// 2.2、trigger-expire < 5s:direct-trigger && make next-trigger-time
|
|
|
|
|
|
|
|
|
|
// 1、trigger
|
|
|
|
|
//执行
|
|
|
|
|
JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null, null);
|
|
|
|
|
logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId() );
|
|
|
|
|
|
|
|
|
|
// 2、fresh next
|
|
|
|
|
//刷新下次执行时间
|
|
|
|
|
refreshNextValidTime(jobInfo, new Date());
|
|
|
|
|
|
|
|
|
|
// next-trigger-time in 5s, pre-read again
|
|
|
|
|
//如果任务在执行中 且 下次执行时间在5秒内 则将 任务 缓存到 ringData
|
|
|
|
|
if (jobInfo.getTriggerStatus()==1 && nowTime + PRE_READ_MS > jobInfo.getTriggerNextTime()) {
|
|
|
|
|
|
|
|
|
|
// 1、make ring second
|
|
|
|
@ -122,7 +132,9 @@ public class JobScheduleHelper {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
}
|
|
|
|
|
//还没到下次执行时间的 缓存到 ringData
|
|
|
|
|
else {
|
|
|
|
|
// 2.3、trigger-pre-read:time-ring trigger && make next-trigger-time
|
|
|
|
|
|
|
|
|
|
// 1、make ring second
|
|
|
|
@ -199,6 +211,7 @@ public class JobScheduleHelper {
|
|
|
|
|
if (cost < 1000) { // scan-overtime, not wait
|
|
|
|
|
try {
|
|
|
|
|
// pre-read period: success > scan each second; fail > skip this period;
|
|
|
|
|
//随机休眠 没任务则休眠5秒内 有任务则休眠1秒内
|
|
|
|
|
TimeUnit.MILLISECONDS.sleep((preReadSuc?1000:PRE_READ_MS) - System.currentTimeMillis()%1000);
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
if (!scheduleThreadToStop) {
|
|
|
|
|