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());