|
|
|
@ -70,7 +70,7 @@ public class JobScheduleHelper {
|
|
|
|
|
connAutoCommit = conn.getAutoCommit();
|
|
|
|
|
conn.setAutoCommit(false);
|
|
|
|
|
|
|
|
|
|
//通过这个来控制多节点只有一个节点会执行 low的一笔
|
|
|
|
|
//TODO 通过这个来控制多节点只有一个节点会执行 low的一笔
|
|
|
|
|
preparedStatement = conn.prepareStatement( "select * from xxl_job_lock where lock_name = 'schedule_lock' for update" );
|
|
|
|
|
preparedStatement.execute();
|
|
|
|
|
|
|
|
|
@ -78,14 +78,14 @@ public class JobScheduleHelper {
|
|
|
|
|
|
|
|
|
|
// 1、pre read
|
|
|
|
|
long nowTime = System.currentTimeMillis();
|
|
|
|
|
//下次执行时间 在5秒内的
|
|
|
|
|
//TODO 下次执行时间 在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秒 任务触发过期策略
|
|
|
|
|
// TODO 当前时间>下次执行时间+5秒 任务触发过期策略 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());
|
|
|
|
@ -104,27 +104,29 @@ public class JobScheduleHelper {
|
|
|
|
|
refreshNextValidTime(jobInfo, new Date());
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//当前时间>下次执行时间 但是控制在5秒内
|
|
|
|
|
//TODO 当前时间>下次执行时间 过期了但是控制在5秒内不算过期
|
|
|
|
|
else if (nowTime > jobInfo.getTriggerNextTime()) {
|
|
|
|
|
// 2.2、trigger-expire < 5s:direct-trigger && make next-trigger-time
|
|
|
|
|
|
|
|
|
|
// 1、trigger
|
|
|
|
|
//执行
|
|
|
|
|
//TODO 执行
|
|
|
|
|
JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null, null);
|
|
|
|
|
logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId() );
|
|
|
|
|
|
|
|
|
|
// 2、fresh next
|
|
|
|
|
//刷新下次执行时间
|
|
|
|
|
//TODO 刷新下次执行时间
|
|
|
|
|
refreshNextValidTime(jobInfo, new Date());
|
|
|
|
|
|
|
|
|
|
// next-trigger-time in 5s, pre-read again
|
|
|
|
|
//如果任务在执行中 且 下次执行时间在5秒内 则将 任务 缓存到 ringData
|
|
|
|
|
//TODO 如果任务在运行状态 且 下次执行时间在5秒内 则将 任务 缓存到 ringData
|
|
|
|
|
if (jobInfo.getTriggerStatus()==1 && nowTime + PRE_READ_MS > jobInfo.getTriggerNextTime()) {
|
|
|
|
|
|
|
|
|
|
// 1、make ring second
|
|
|
|
|
//TODO 获取下次执行时间 是哪一秒 作为缓存的key
|
|
|
|
|
int ringSecond = (int)((jobInfo.getTriggerNextTime()/1000)%60);
|
|
|
|
|
|
|
|
|
|
// 2、push time ring
|
|
|
|
|
//TODO 缓存至 ringData
|
|
|
|
|
pushTimeRing(ringSecond, jobInfo.getId());
|
|
|
|
|
|
|
|
|
|
// 3、fresh next
|
|
|
|
@ -249,7 +251,8 @@ public class JobScheduleHelper {
|
|
|
|
|
try {
|
|
|
|
|
// second data
|
|
|
|
|
List<Integer> ringItemData = new ArrayList<>();
|
|
|
|
|
int nowSecond = Calendar.getInstance().get(Calendar.SECOND); // 避免处理耗时太长,跨过刻度,向前校验一个刻度;
|
|
|
|
|
//TODO 避免处理耗时太长,跨过刻度,向前校验一个刻度;
|
|
|
|
|
int nowSecond = Calendar.getInstance().get(Calendar.SECOND);
|
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
|
|
|
List<Integer> tmpData = ringData.remove( (nowSecond+60-i)%60 );
|
|
|
|
|
if (tmpData != null) {
|
|
|
|
@ -262,7 +265,7 @@ public class JobScheduleHelper {
|
|
|
|
|
if (ringItemData.size() > 0) {
|
|
|
|
|
// do trigger
|
|
|
|
|
for (int jobId: ringItemData) {
|
|
|
|
|
// do trigger
|
|
|
|
|
//TODO do trigger
|
|
|
|
|
JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null, null);
|
|
|
|
|
}
|
|
|
|
|
// clear
|
|
|
|
|