From 4f53622b54ac276daa2428c5a81bea042ba4aaa4 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sat, 6 Dec 2025 23:33:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=99=A8=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96=EF=BC=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=97=B6=E4=B8=80=E5=B9=B6=E6=B8=85=E7=90=86=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=A1=A8=E6=95=B0=E6=8D=AE=EF=BC=8C=E9=81=BF=E5=85=8D=E5=B0=8F?= =?UTF-8?q?=E6=A6=82=E7=8E=87=E6=83=85=E5=86=B5=E4=B8=8B=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=A0=86=E7=A7=AF=EF=BC=88ISSUE-3669?= =?UTF-8?q?=EF=BC=89=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 3 ++- .../admin/controller/biz/JobGroupController.java | 14 ++++++++++++-- .../xxl/job/admin/mapper/XxlJobRegistryMapper.java | 3 +++ .../admin/scheduler/thread/JobRegistryHelper.java | 2 +- .../main/resources/mapper/XxlJobRegistryMapper.xml | 6 ++++++ .../main/resources/templates/biz/group.list.ftl | 2 +- .../job/admin/mapper/XxlJobRegistryMapperTest.java | 3 ++- 7 files changed, 27 insertions(+), 6 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 3761dae2..08ecdf63 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2701,7 +2701,8 @@ public void execute() { - 1、【修复】调度组件事务代码优化,修复DB超时等小概率情况下调度终止问题; - 2、【修复】合并PR-3869,修复底层通讯超时设置无效问题; - 3、【新增】新增“执行器启用开关”配置项(xxl.job.executor.enabled),默认开启,关闭时不进行执行器初始化; -- 4、【TODO】任务调度触发后分批批量更新,提升调度性能; +- 4、【优化】执行器删除逻辑优化,删除时一并清理注册表数据,避免小概率情况下注册数据堆积(ISSUE-3669); +- 5、【TODO】任务调度触发后分批批量更新,提升调度性能; ### TODO LIST diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobGroupController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobGroupController.java index 03b409df..ad043978 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobGroupController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobGroupController.java @@ -183,24 +183,34 @@ public class JobGroupController { @XxlSso(role = Consts.ADMIN_ROLE) public Response delete(@RequestParam("ids[]") List ids){ - // valid + // parse id if (CollectionTool.isEmpty(ids) || ids.size()!=1) { return Response.ofFail(I18nUtil.getString("system_please_choose") + I18nUtil.getString("system_one") + I18nUtil.getString("system_data")); } int id = ids.get(0); - // valid + // valid repeat operation + XxlJobGroup xxlJobGroup = xxlJobGroupMapper.load(id); + if (xxlJobGroup == null) { + return Response.ofSuccess(); + } + + // whether exists job int count = xxlJobInfoMapper.pageListCount(0, 10, id, -1, null, null, null); if (count > 0) { return Response.ofFail( I18nUtil.getString("jobgroup_del_limit_0") ); } + // whether only exists one group List allList = xxlJobGroupMapper.findAll(); if (allList.size() == 1) { return Response.ofFail( I18nUtil.getString("jobgroup_del_limit_1") ); } + // remove group int ret = xxlJobGroupMapper.remove(id); + // remove registry-data + xxlJobRegistryMapper.removeByRegistryGroupAndKey(RegistType.EXECUTOR.name(), xxlJobGroup.getAppname()); return (ret>0)?Response.ofSuccess():Response.ofFail(); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobRegistryMapper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobRegistryMapper.java index 1462d414..6bcf87aa 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobRegistryMapper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobRegistryMapper.java @@ -40,4 +40,7 @@ public interface XxlJobRegistryMapper { @Param("registryKey") String registryKey, @Param("registryValue") String registryValue); + public int removeByRegistryGroupAndKey(@Param("registryGroup") String registryGroup, + @Param("registryKey") String registryKey); + } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobRegistryHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobRegistryHelper.java index b94882bf..e72468a9 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobRegistryHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobRegistryHelper.java @@ -66,7 +66,7 @@ public class JobRegistryHelper { // remove dead address (admin/executor) List ids = XxlJobAdminBootstrap.getInstance().getXxlJobRegistryMapper().findDead(Const.DEAD_TIMEOUT, new Date()); - if (ids!=null && ids.size()>0) { + if (ids!=null && !ids.isEmpty()) { XxlJobAdminBootstrap.getInstance().getXxlJobRegistryMapper().removeDead(ids); } diff --git a/xxl-job-admin/src/main/resources/mapper/XxlJobRegistryMapper.xml b/xxl-job-admin/src/main/resources/mapper/XxlJobRegistryMapper.xml index a9e8e9a3..d5fac776 100644 --- a/xxl-job-admin/src/main/resources/mapper/XxlJobRegistryMapper.xml +++ b/xxl-job-admin/src/main/resources/mapper/XxlJobRegistryMapper.xml @@ -68,4 +68,10 @@ AND registry_value = #{registryValue} + + DELETE FROM xxl_job_registry + WHERE registry_group = #{registryGroup} + AND registry_key = #{registryKey} + + \ No newline at end of file diff --git a/xxl-job-admin/src/main/resources/templates/biz/group.list.ftl b/xxl-job-admin/src/main/resources/templates/biz/group.list.ftl index 3eee0f08..89012a7d 100644 --- a/xxl-job-admin/src/main/resources/templates/biz/group.list.ftl +++ b/xxl-job-admin/src/main/resources/templates/biz/group.list.ftl @@ -52,7 +52,7 @@
- +
diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobRegistryMapperTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobRegistryMapperTest.java index b886b3ad..e166cb10 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobRegistryMapperTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobRegistryMapperTest.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.mapper; import com.xxl.job.admin.model.XxlJobRegistry; +import com.xxl.job.core.constant.RegistType; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -18,7 +19,7 @@ public class XxlJobRegistryMapperTest { @Test public void test(){ - int ret = xxlJobRegistryMapper.registrySaveOrUpdate("g1", "k1", "v1", new Date()); + int ret = xxlJobRegistryMapper.registrySaveOrUpdate(RegistType.EXECUTOR.name(), "xxl-job-executor-z1", "v1", new Date()); /*int ret = xxlJobRegistryDao.registryUpdate("g1", "k1", "v1", new Date()); if (ret < 1) { ret = xxlJobRegistryDao.registrySave("g1", "k1", "v1", new Date());