From b5c5bf7b9788544bb704206c271af5a7e0d13f11 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sat, 25 Oct 2025 04:03:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=A6=E8=BF=87=E6=9C=9F=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E3=80=81=E8=B0=83=E5=BA=A6=E7=B1=BB=E5=9E=8B=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E9=87=8D=E6=9E=84=EF=BC=8C=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=8C=96=E6=8B=86=E5=88=86=E5=B9=B6=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E6=97=A5=E5=BF=97=EF=BC=8C=E6=8F=90=E5=8D=87=E5=81=A5?= =?UTF-8?q?=E5=A3=AE=E6=80=A7=E5=8F=8A=E5=8F=AF=E7=BB=B4=E6=8A=A4=E6=80=A7?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 11 ++-- .../controller/biz/JobInfoController.java | 10 ++- .../scheduler/enums/ScheduleTypeEnum.java | 46 -------------- .../scheduler/thread/JobScheduleHelper.java | 47 +++++--------- .../admin/scheduler/type/ScheduleType.java | 22 +++++++ .../scheduler/type/ScheduleTypeEnum.java | 62 +++++++++++++++++++ .../type/strategy/CronScheduleType.java | 17 +++++ .../type/strategy/FixRateScheduleType.java | 16 +++++ .../type/strategy/NoneScheduleType.java | 16 +++++ .../admin/service/impl/XxlJobServiceImpl.java | 14 +++-- .../admin/mapper/XxlJobInfoMapperTest.java | 2 +- 11 files changed, 172 insertions(+), 91 deletions(-) delete mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/enums/ScheduleTypeEnum.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleType.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleTypeEnum.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/CronScheduleType.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/FixRateScheduleType.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/NoneScheduleType.java diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 7a51dad6..e0755a33 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2579,12 +2579,11 @@ public void execute() { - 7、【优化】调度组件日志完善,提升边界情况下问题定位效率; - 8、【修复】调度预读任务数量调整,改为调度线程池大小x10,降低事务颗粒度,提升性能及稳定性; - 9、【优化】调度不重不漏逻辑优化:调度时间轮单刻度数据去重,避免极端情况下任务重复执行;时间轮转动时校验临近刻度,避免极端情况下遗漏刻度; -- 10、【重构】调度过期策略重构,代码组件化拆分并完善日志; - -- 7、【ING】UI框架重构升级,提升交互体验; -- 8、【ING】调整资源加载逻辑,移除不必要的拦截器逻辑,提升页面加载效率; -- 9、【ING】规范API交互协议,通用响应结构体调整为Response; -- 10、【ING】Http通讯组件升级,基于接口代理方式重构; +- 10、【重构】调度过期策略、调度类型策略逻辑重构,代码组件化拆分并完善日志,提升健壮性及可维护性; +- 11、【ING】UI框架重构升级,提升交互体验; +- 12、【ING】调整资源加载逻辑,移除不必要的拦截器逻辑,提升页面加载效率; +- 13、【ING】规范API交互协议,通用响应结构体调整为Response; +- 14、【ING】Http通讯组件升级,基于接口代理方式重构; ### TODO LIST diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobInfoController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobInfoController.java index 2817b20f..7ecb91b4 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobInfoController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobInfoController.java @@ -6,8 +6,7 @@ import com.xxl.job.admin.model.XxlJobInfo; import com.xxl.job.admin.scheduler.exception.XxlJobException; import com.xxl.job.admin.scheduler.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.scheduler.misfire.MisfireStrategyEnum; -import com.xxl.job.admin.scheduler.enums.ScheduleTypeEnum; -import com.xxl.job.admin.scheduler.thread.JobScheduleHelper; +import com.xxl.job.admin.scheduler.type.ScheduleTypeEnum; import com.xxl.job.admin.service.XxlJobService; import com.xxl.job.admin.util.I18nUtil; import com.xxl.job.admin.util.JobGroupPermissionUtil; @@ -155,7 +154,12 @@ public class JobInfoController { try { Date lastTime = new Date(); for (int i = 0; i < 5; i++) { - lastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime); + + // generate next trigger time + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(paramXxlJobInfo.getScheduleType(), ScheduleTypeEnum.NONE); + lastTime = scheduleTypeEnum.getScheduleType().generateNextTriggerTime(paramXxlJobInfo, lastTime); + + // collect data if (lastTime != null) { result.add(DateUtil.formatDateTime(lastTime)); } else { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/enums/ScheduleTypeEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/enums/ScheduleTypeEnum.java deleted file mode 100644 index 6ce66a3f..00000000 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/enums/ScheduleTypeEnum.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.xxl.job.admin.scheduler.enums; - -import com.xxl.job.admin.util.I18nUtil; - -/** - * @author xuxueli 2020-10-29 21:11:23 - */ -public enum ScheduleTypeEnum { - - NONE(I18nUtil.getString("schedule_type_none")), - - /** - * schedule by cron - */ - CRON(I18nUtil.getString("schedule_type_cron")), - - /** - * schedule by fixed rate (in seconds) - */ - FIX_RATE(I18nUtil.getString("schedule_type_fix_rate")), - - /** - * schedule by fix delay (in seconds), after the last time - */ - /*FIX_DELAY(I18nUtil.getString("schedule_type_fix_delay"))*/; - - private String title; - - ScheduleTypeEnum(String title) { - this.title = title; - } - - public String getTitle() { - return title; - } - - public static ScheduleTypeEnum match(String name, ScheduleTypeEnum defaultItem){ - for (ScheduleTypeEnum item: ScheduleTypeEnum.values()) { - if (item.name().equals(name)) { - return item; - } - } - return defaultItem; - } - -} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobScheduleHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobScheduleHelper.java index 4e5764df..c51b53c7 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobScheduleHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobScheduleHelper.java @@ -2,9 +2,8 @@ package com.xxl.job.admin.scheduler.thread; import com.xxl.job.admin.model.XxlJobInfo; import com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap; -import com.xxl.job.admin.scheduler.cron.CronExpression; import com.xxl.job.admin.scheduler.misfire.MisfireStrategyEnum; -import com.xxl.job.admin.scheduler.enums.ScheduleTypeEnum; +import com.xxl.job.admin.scheduler.type.ScheduleTypeEnum; import com.xxl.job.admin.scheduler.trigger.TriggerTypeEnum; import com.xxl.tool.core.CollectionTool; import com.xxl.tool.core.MapTool; @@ -85,7 +84,7 @@ public class JobScheduleHelper { misfireStrategyEnum.getMisfireHandler().handle(jobInfo.getId()); // 2、fresh next - refreshNextValidTime(jobInfo, new Date()); + refreshNextTriggerTime(jobInfo, new Date()); } else if (nowTime > jobInfo.getTriggerNextTime()) { // 2.2、trigger-expire < 5s:direct-trigger && make next-trigger-time @@ -95,7 +94,7 @@ public class JobScheduleHelper { logger.debug(">>>>>>>>>>> xxl-job, schedule expire, direct trigger : jobId = " + jobInfo.getId() ); // 2、fresh next - refreshNextValidTime(jobInfo, new Date()); + refreshNextTriggerTime(jobInfo, new Date()); // next-trigger-time in 5s, pre-read again if (jobInfo.getTriggerStatus()==1 && nowTime + PRE_READ_MS > jobInfo.getTriggerNextTime()) { @@ -108,7 +107,7 @@ public class JobScheduleHelper { logger.debug(">>>>>>>>>>> xxl-job, schedule pre-read, push trigger : jobId = " + jobInfo.getId() ); // 3、fresh next - refreshNextValidTime(jobInfo, new Date(jobInfo.getTriggerNextTime())); + refreshNextTriggerTime(jobInfo, new Date(jobInfo.getTriggerNextTime())); } @@ -123,7 +122,7 @@ public class JobScheduleHelper { logger.debug(">>>>>>>>>>> xxl-job, schedule normal, push trigger : jobId = " + jobInfo.getId() ); // 3、fresh next - refreshNextValidTime(jobInfo, new Date(jobInfo.getTriggerNextTime())); + refreshNextTriggerTime(jobInfo, new Date(jobInfo.getTriggerNextTime())); } @@ -234,20 +233,25 @@ public class JobScheduleHelper { } /** - * refresh next valid time of job + * refresh next trigger time of job * * @param jobInfo job info * @param fromTime from time */ - private void refreshNextValidTime(XxlJobInfo jobInfo, Date fromTime) { + private void refreshNextTriggerTime(XxlJobInfo jobInfo, Date fromTime) { try { - Date nextValidTime = generateNextValidTime(jobInfo, fromTime); - if (nextValidTime != null) { + // generate next trigger time + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), ScheduleTypeEnum.NONE); + Date nextTriggerTime = scheduleTypeEnum.getScheduleType().generateNextTriggerTime(jobInfo, fromTime); + + // refresh next trigger-time + status + if (nextTriggerTime != null) { + // generate success jobInfo.setTriggerStatus(-1); // pass, may be Inaccurate jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime()); - jobInfo.setTriggerNextTime(nextValidTime.getTime()); + jobInfo.setTriggerNextTime(nextTriggerTime.getTime()); } else { - // generateNextValidTime fail, stop job + // generate fail, stop job jobInfo.setTriggerStatus(0); jobInfo.setTriggerLastTime(0); jobInfo.setTriggerNextTime(0); @@ -255,7 +259,7 @@ public class JobScheduleHelper { jobInfo.getId(), jobInfo.getScheduleType(), jobInfo.getScheduleConf()); } } catch (Throwable e) { - // generateNextValidTime error, stop job + // generate error, stop job jobInfo.setTriggerStatus(0); jobInfo.setTriggerLastTime(0); jobInfo.setTriggerNextTime(0); @@ -343,21 +347,4 @@ public class JobScheduleHelper { logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper stop"); } - - // ---------------------- tools ---------------------- - - /** - * generate next valid time - */ - public static Date generateNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception { - ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); - if (ScheduleTypeEnum.CRON == scheduleTypeEnum) { - Date nextValidTime = new CronExpression(jobInfo.getScheduleConf()).getNextValidTimeAfter(fromTime); - return nextValidTime; - } else if (ScheduleTypeEnum.FIX_RATE == scheduleTypeEnum /*|| ScheduleTypeEnum.FIX_DELAY == scheduleTypeEnum*/) { - return new Date(fromTime.getTime() + Long.parseLong(jobInfo.getScheduleConf()) * 1000L); - } - return null; - } - } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleType.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleType.java new file mode 100644 index 00000000..1c4f8df2 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleType.java @@ -0,0 +1,22 @@ +package com.xxl.job.admin.scheduler.type; + +import com.xxl.job.admin.model.XxlJobInfo; + +import java.util.Date; + +/** + * Schedule Type + * + * @author xuxueli 2020-10-29 + */ +public abstract class ScheduleType { + + /** + * generate next trigger time + * + * @param jobInfo job info + * @param fromTime from time + */ + public abstract Date generateNextTriggerTime(XxlJobInfo jobInfo, Date fromTime) throws Exception; + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleTypeEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleTypeEnum.java new file mode 100644 index 00000000..f76e5313 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleTypeEnum.java @@ -0,0 +1,62 @@ +package com.xxl.job.admin.scheduler.type; + +import com.xxl.job.admin.scheduler.type.strategy.CronScheduleType; +import com.xxl.job.admin.scheduler.type.strategy.FixRateScheduleType; +import com.xxl.job.admin.scheduler.type.strategy.NoneScheduleType; +import com.xxl.job.admin.util.I18nUtil; + +/** + * @author xuxueli 2020-10-29 21:11:23 + */ +public enum ScheduleTypeEnum { + + NONE(I18nUtil.getString("schedule_type_none"), new NoneScheduleType()), + + /** + * schedule by cron + */ + CRON(I18nUtil.getString("schedule_type_cron"), new CronScheduleType()), + + /** + * schedule by fixed rate (in seconds) + */ + FIX_RATE(I18nUtil.getString("schedule_type_fix_rate"), new FixRateScheduleType()), + + /** + * schedule by fix delay (in seconds), after the last time + */ + /*FIX_DELAY(I18nUtil.getString("schedule_type_fix_delay"))*/; + + private final String title; + private final ScheduleType scheduleType;; + + ScheduleTypeEnum(String title, ScheduleType scheduleType) { + this.title = title; + this.scheduleType = scheduleType; + } + + public String getTitle() { + return title; + } + + public ScheduleType getScheduleType() { + return scheduleType; + } + + /** + * match by name + * + * @param name name of ScheduleTypeEnum + * @param defaultItem default item + * @return ScheduleTypeEnum + */ + public static ScheduleTypeEnum match(String name, ScheduleTypeEnum defaultItem){ + for (ScheduleTypeEnum item: ScheduleTypeEnum.values()) { + if (item.name().equals(name)) { + return item; + } + } + return defaultItem; + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/CronScheduleType.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/CronScheduleType.java new file mode 100644 index 00000000..e7b86611 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/CronScheduleType.java @@ -0,0 +1,17 @@ +package com.xxl.job.admin.scheduler.type.strategy; + +import com.xxl.job.admin.model.XxlJobInfo; +import com.xxl.job.admin.scheduler.cron.CronExpression; +import com.xxl.job.admin.scheduler.type.ScheduleType; + +import java.util.Date; + +public class CronScheduleType extends ScheduleType { + + @Override + public Date generateNextTriggerTime(XxlJobInfo jobInfo, Date fromTime) throws Exception { + // generate next trigger time, with cron + return new CronExpression(jobInfo.getScheduleConf()).getNextValidTimeAfter(fromTime); + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/FixRateScheduleType.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/FixRateScheduleType.java new file mode 100644 index 00000000..290a4200 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/FixRateScheduleType.java @@ -0,0 +1,16 @@ +package com.xxl.job.admin.scheduler.type.strategy; + +import com.xxl.job.admin.model.XxlJobInfo; +import com.xxl.job.admin.scheduler.type.ScheduleType; + +import java.util.Date; + +public class FixRateScheduleType extends ScheduleType { + + @Override + public Date generateNextTriggerTime(XxlJobInfo jobInfo, Date fromTime) throws Exception { + // generate next trigger time, fix rate delay + return new Date(fromTime.getTime() + Long.parseLong(jobInfo.getScheduleConf()) * 1000L); + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/NoneScheduleType.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/NoneScheduleType.java new file mode 100644 index 00000000..d17b1e83 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/NoneScheduleType.java @@ -0,0 +1,16 @@ +package com.xxl.job.admin.scheduler.type.strategy; + +import com.xxl.job.admin.model.XxlJobInfo; +import com.xxl.job.admin.scheduler.type.ScheduleType; + +import java.util.Date; + +public class NoneScheduleType extends ScheduleType { + + @Override + public Date generateNextTriggerTime(XxlJobInfo jobInfo, Date fromTime) throws Exception { + // generate none trigger-time + return null; + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java index a1a53215..3807f86a 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -7,7 +7,7 @@ import com.xxl.job.admin.model.XxlJobLogReport; import com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap; import com.xxl.job.admin.scheduler.cron.CronExpression; import com.xxl.job.admin.scheduler.misfire.MisfireStrategyEnum; -import com.xxl.job.admin.scheduler.enums.ScheduleTypeEnum; +import com.xxl.job.admin.scheduler.type.ScheduleTypeEnum; import com.xxl.job.admin.scheduler.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.scheduler.thread.JobScheduleHelper; import com.xxl.job.admin.scheduler.trigger.TriggerTypeEnum; @@ -273,10 +273,12 @@ public class XxlJobServiceImpl implements XxlJobService { // next trigger time (5s后生效,避开预读周期) long nextTriggerTime = exists_jobInfo.getTriggerNextTime(); - boolean scheduleDataNotChanged = jobInfo.getScheduleType().equals(exists_jobInfo.getScheduleType()) && jobInfo.getScheduleConf().equals(exists_jobInfo.getScheduleConf()); + boolean scheduleDataNotChanged = jobInfo.getScheduleType().equals(exists_jobInfo.getScheduleType()) + && jobInfo.getScheduleConf().equals(exists_jobInfo.getScheduleConf()); // 触发配置如果不变,避免重复计算; if (exists_jobInfo.getTriggerStatus() == 1 && !scheduleDataNotChanged) { try { - Date nextValidTime = JobScheduleHelper.generateNextValidTime(jobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); + // generate next trigger time + Date nextValidTime = scheduleTypeEnum.getScheduleType().generateNextTriggerTime(jobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); if (nextValidTime == null) { return ReturnT.ofFail ( (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); } @@ -343,7 +345,7 @@ public class XxlJobServiceImpl implements XxlJobService { return ReturnT.ofFail(I18nUtil.getString("system_permission_limit")); } - // valid + // valid ScheduleType: can not be none ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(xxlJobInfo.getScheduleType(), ScheduleTypeEnum.NONE); if (ScheduleTypeEnum.NONE == scheduleTypeEnum) { return ReturnT.ofFail(I18nUtil.getString("schedule_type_none_limit_start")); @@ -352,7 +354,9 @@ public class XxlJobServiceImpl implements XxlJobService { // next trigger time (5s后生效,避开预读周期) long nextTriggerTime = 0; try { - Date nextValidTime = JobScheduleHelper.generateNextValidTime(xxlJobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); + // generate next trigger time + Date nextValidTime = scheduleTypeEnum.getScheduleType().generateNextTriggerTime(xxlJobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); + if (nextValidTime == null) { return ReturnT.ofFail ( (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); } diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobInfoMapperTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobInfoMapperTest.java index 167f3d35..617ff204 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobInfoMapperTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobInfoMapperTest.java @@ -2,7 +2,7 @@ package com.xxl.job.admin.mapper; import com.xxl.job.admin.model.XxlJobInfo; import com.xxl.job.admin.scheduler.misfire.MisfireStrategyEnum; -import com.xxl.job.admin.scheduler.enums.ScheduleTypeEnum; +import com.xxl.job.admin.scheduler.type.ScheduleTypeEnum; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.slf4j.Logger;