From 492d720215b08c0e3f586bfff9c4ee6eadfd4c2f Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sat, 25 Oct 2025 03:22:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E8=BF=87=E6=9C=9F=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E9=87=8D=E6=9E=84=EF=BC=8C=E4=BB=A3=E7=A0=81=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=8C=96=E6=8B=86=E5=88=86=E5=B9=B6=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E6=97=A5=E5=BF=97=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + .../controller/biz/JobInfoController.java | 2 +- .../scheduler/enums/MisfireStrategyEnum.java | 39 -------------- .../scheduler/misfire/MisfireHandler.java | 17 ++++++ .../misfire/MisfireStrategyEnum.java | 54 +++++++++++++++++++ .../misfire/strategy/MisfireDoNothing.java | 15 ++++++ .../misfire/strategy/MisfireFireOnceNow.java | 19 +++++++ .../admin/scheduler/route/ExecutorRouter.java | 2 +- .../scheduler/thread/JobScheduleHelper.java | 16 ++---- .../admin/service/impl/XxlJobServiceImpl.java | 2 +- .../admin/mapper/XxlJobInfoMapperTest.java | 2 +- 11 files changed, 115 insertions(+), 54 deletions(-) delete mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/enums/MisfireStrategyEnum.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireHandler.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireStrategyEnum.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireDoNothing.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireFireOnceNow.java diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 82ff7209..7a51dad6 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2579,6 +2579,7 @@ public void execute() { - 7、【优化】调度组件日志完善,提升边界情况下问题定位效率; - 8、【修复】调度预读任务数量调整,改为调度线程池大小x10,降低事务颗粒度,提升性能及稳定性; - 9、【优化】调度不重不漏逻辑优化:调度时间轮单刻度数据去重,避免极端情况下任务重复执行;时间轮转动时校验临近刻度,避免极端情况下遗漏刻度; +- 10、【重构】调度过期策略重构,代码组件化拆分并完善日志; - 7、【ING】UI框架重构升级,提升交互体验; - 8、【ING】调整资源加载逻辑,移除不必要的拦截器逻辑,提升页面加载效率; 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 a7d4a93b..2817b20f 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 @@ -5,7 +5,7 @@ import com.xxl.job.admin.model.XxlJobGroup; 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.enums.MisfireStrategyEnum; +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.service.XxlJobService; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/enums/MisfireStrategyEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/enums/MisfireStrategyEnum.java deleted file mode 100644 index d984eb06..00000000 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/enums/MisfireStrategyEnum.java +++ /dev/null @@ -1,39 +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 MisfireStrategyEnum { - - /** - * do nothing - */ - DO_NOTHING(I18nUtil.getString("misfire_strategy_do_nothing")), - - /** - * fire once now - */ - FIRE_ONCE_NOW(I18nUtil.getString("misfire_strategy_fire_once_now")); - - private String title; - - MisfireStrategyEnum(String title) { - this.title = title; - } - - public String getTitle() { - return title; - } - - public static MisfireStrategyEnum match(String name, MisfireStrategyEnum defaultItem){ - for (MisfireStrategyEnum item: MisfireStrategyEnum.values()) { - if (item.name().equals(name)) { - return item; - } - } - return defaultItem; - } - -} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireHandler.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireHandler.java new file mode 100644 index 00000000..e3969364 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireHandler.java @@ -0,0 +1,17 @@ +package com.xxl.job.admin.scheduler.misfire; + +/** + * Misfire Handler + * + * @author xuxueli 2020-10-29 + */ +public abstract class MisfireHandler { + + /** + * misfire handle + * + * @param jobId jobId + */ + public abstract void handle(final int jobId); + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireStrategyEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireStrategyEnum.java new file mode 100644 index 00000000..bd31fb1c --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireStrategyEnum.java @@ -0,0 +1,54 @@ +package com.xxl.job.admin.scheduler.misfire; + +import com.xxl.job.admin.scheduler.misfire.strategy.MisfireDoNothing; +import com.xxl.job.admin.scheduler.misfire.strategy.MisfireFireOnceNow; +import com.xxl.job.admin.util.I18nUtil; + +/** + * @author xuxueli 2020-10-29 21:11:23 + */ +public enum MisfireStrategyEnum { + + /** + * do nothing + */ + DO_NOTHING(I18nUtil.getString("misfire_strategy_do_nothing"), new MisfireDoNothing()), + + /** + * fire once now + */ + FIRE_ONCE_NOW(I18nUtil.getString("misfire_strategy_fire_once_now"), new MisfireFireOnceNow()); + + private final String title; + private final MisfireHandler misfireHandler; + + MisfireStrategyEnum(String title, MisfireHandler misfireHandler) { + this.title = title; + this.misfireHandler = misfireHandler; + } + + public String getTitle() { + return title; + } + + public MisfireHandler getMisfireHandler() { + return misfireHandler; + } + + /** + * match misfire strategy + * + * @param name name of misfire strategy + * @param defaultItem default misfire strategy + * @return misfire strategy + */ + public static MisfireStrategyEnum match(String name, MisfireStrategyEnum defaultItem){ + for (MisfireStrategyEnum item: MisfireStrategyEnum.values()) { + if (item.name().equals(name)) { + return item; + } + } + return defaultItem; + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireDoNothing.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireDoNothing.java new file mode 100644 index 00000000..9f5844a6 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireDoNothing.java @@ -0,0 +1,15 @@ +package com.xxl.job.admin.scheduler.misfire.strategy; + +import com.xxl.job.admin.scheduler.misfire.MisfireHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MisfireDoNothing extends MisfireHandler { + private static final Logger logger = LoggerFactory.getLogger(MisfireDoNothing.class); + + @Override + public void handle(int jobId) { + logger.warn(">>>>>>>>>>> xxl-job, schedule MisfireDoNothing: jobId = " + jobId ); + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireFireOnceNow.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireFireOnceNow.java new file mode 100644 index 00000000..479eef2a --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireFireOnceNow.java @@ -0,0 +1,19 @@ +package com.xxl.job.admin.scheduler.misfire.strategy; + +import com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap; +import com.xxl.job.admin.scheduler.misfire.MisfireHandler; +import com.xxl.job.admin.scheduler.trigger.TriggerTypeEnum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MisfireFireOnceNow extends MisfireHandler { + protected static Logger logger = LoggerFactory.getLogger(MisfireFireOnceNow.class); + + @Override + public void handle(int jobId) { + // FIRE_ONCE_NOW 》 trigger + XxlJobAdminBootstrap.getInstance().getJobTriggerPoolHelper().trigger(jobId, TriggerTypeEnum.MISFIRE, -1, null, null, null); + logger.warn(">>>>>>>>>>> xxl-job, schedule MisfireFireOnceNow: jobId = " + jobId ); + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/ExecutorRouter.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/ExecutorRouter.java index c877f451..58a18482 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/ExecutorRouter.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/ExecutorRouter.java @@ -16,7 +16,7 @@ public abstract class ExecutorRouter { /** * route address * - * @param addressList + * @param addressList executor address list * @return ReturnT.content=address */ public abstract ReturnT route(TriggerParam triggerParam, List addressList); 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 08a3ed3d..4e5764df 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 @@ -3,7 +3,7 @@ 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.enums.MisfireStrategyEnum; +import com.xxl.job.admin.scheduler.misfire.MisfireStrategyEnum; import com.xxl.job.admin.scheduler.enums.ScheduleTypeEnum; import com.xxl.job.admin.scheduler.trigger.TriggerTypeEnum; import com.xxl.tool.core.CollectionTool; @@ -80,15 +80,9 @@ public class JobScheduleHelper { if (nowTime > jobInfo.getTriggerNextTime() + PRE_READ_MS) { // 2.1、trigger-expire > 5s:pass && make next-trigger-time - // 1、misfire match + // 1、misfire handle MisfireStrategyEnum misfireStrategyEnum = MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING); - if (MisfireStrategyEnum.FIRE_ONCE_NOW == misfireStrategyEnum) { - // FIRE_ONCE_NOW 》 trigger - XxlJobAdminBootstrap.getInstance().getJobTriggerPoolHelper().trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, null, null); - logger.debug(">>>>>>>>>>> xxl-job, schedule misfire, FIRE_ONCE_NOW trigger : jobId = " + jobInfo.getId() ); - } else { - logger.debug(">>>>>>>>>>> xxl-job, schedule misfire, DO_NOTHING: jobId = " + jobInfo.getId() ); - } + misfireStrategyEnum.getMisfireHandler().handle(jobInfo.getId()); // 2、fresh next refreshNextValidTime(jobInfo, new Date()); @@ -96,7 +90,7 @@ public class JobScheduleHelper { } else if (nowTime > jobInfo.getTriggerNextTime()) { // 2.2、trigger-expire < 5s:direct-trigger && make next-trigger-time - // 1、trigger + // 1、trigger direct XxlJobAdminBootstrap.getInstance().getJobTriggerPoolHelper().trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null, null); logger.debug(">>>>>>>>>>> xxl-job, schedule expire, direct trigger : jobId = " + jobInfo.getId() ); @@ -109,7 +103,7 @@ public class JobScheduleHelper { // 1、make ring second int ringSecond = (int)((jobInfo.getTriggerNextTime()/1000)%60); - // 2、push time ring + // 2、push time ring (pre read) pushTimeRing(ringSecond, jobInfo.getId()); logger.debug(">>>>>>>>>>> xxl-job, schedule pre-read, push trigger : jobId = " + jobInfo.getId() ); 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 00aeceb8..a1a53215 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 @@ -6,7 +6,7 @@ import com.xxl.job.admin.model.XxlJobInfo; 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.enums.MisfireStrategyEnum; +import com.xxl.job.admin.scheduler.misfire.MisfireStrategyEnum; import com.xxl.job.admin.scheduler.enums.ScheduleTypeEnum; import com.xxl.job.admin.scheduler.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.scheduler.thread.JobScheduleHelper; 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 de7697f0..167f3d35 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 @@ -1,7 +1,7 @@ package com.xxl.job.admin.mapper; import com.xxl.job.admin.model.XxlJobInfo; -import com.xxl.job.admin.scheduler.enums.MisfireStrategyEnum; +import com.xxl.job.admin.scheduler.misfire.MisfireStrategyEnum; import com.xxl.job.admin.scheduler.enums.ScheduleTypeEnum; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test;