From f352ded10d420bbb44b404fcc2c6f6b10fabc766 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sun, 1 Dec 2024 02:37:22 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E9=87=8D=E6=9E=84=E3=80=91=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=99=A8=E6=B3=A8=E5=86=8C=E9=80=BB=E8=BE=91=E9=87=8D?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E9=99=8D=E4=BD=8E=E5=A4=9A=E8=B0=83=E5=BA=A6?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E5=9C=B0=E5=9D=80=E6=97=B6=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E9=97=AE=E9=A2=98=EF=BC=9B=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=A1=A8=E2=80=9Cxxl=5Fjob=5Fregistry=E2=80=9D=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=94=AF=E4=B8=80=E7=B4=A2=E5=BC=95=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=86=97=E4=BD=99=E6=B3=A8=E5=86=8C=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=AD=98=E5=82=A8=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 3 ++- doc/db/tables_xxl_job.sql | 2 +- .../admin/core/thread/JobRegistryHelper.java | 12 +++++++--- .../xxl/job/admin/dao/XxlJobRegistryDao.java | 9 ++++++-- .../mybatis-mapper/XxlJobRegistryMapper.xml | 9 ++++++++ .../job/admin/dao/XxlJobRegistryDaoTest.java | 23 +++++++++++++++++-- 6 files changed, 49 insertions(+), 9 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 8056dede..7a9b8aff 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2403,7 +2403,8 @@ public void execute() { ### 7.36 版本 v2.5.0 Release Notes[规划中] - 1、【优化】框架基础守护线程异常处理逻辑优化,避免极端情况下因Error导致调度终止问题; - 2、【优化】部分系统日志优化,提升可读性; -- 3、【优化】调度线程任务信息更新逻辑优化,避免极端情况下已关闭任务被启动问题; +- 3、【重构】调度线程任务信息更新逻辑优化,避免极端情况下已关闭任务被启动问题; +- 5、【重构】执行器注册逻辑重构,降低多调度中心地址时并发注册问题;注册表“xxl_job_registry”新增唯一索引,避免冗余注册信息存储; - 4、[规划中]升级springboot3.x,解决2.x老版本漏洞类问题。注意,springboot3.x依赖jdk17; - 5、[规划中]安全功能增强,通讯加密参数改用加密数据避免AccessToken明文, 降低token泄漏风险; - 6、[规划中]登陆态Token声称逻辑优化,混淆登陆时间属性,降低token泄漏风险; diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql index 8a90bcb3..286b3616 100644 --- a/doc/db/tables_xxl_job.sql +++ b/doc/db/tables_xxl_job.sql @@ -85,7 +85,7 @@ CREATE TABLE `xxl_job_registry` ( `registry_value` varchar(255) NOT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), - KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) + UNIQUE KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_group` ( diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java index 05f4a244..9e961c57 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java @@ -159,13 +159,19 @@ public class JobRegistryHelper { registryOrRemoveThreadPool.execute(new Runnable() { @Override public void run() { - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + // 0-fail; 1-save suc; 2-update suc; + int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySaveOrUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + if (ret == 1) { + // fresh (add) + freshGroupRegistryInfo(registryParam); + } + /*int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); if (ret < 1) { XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); // fresh freshGroupRegistryInfo(registryParam); - } + }*/ } }); @@ -187,7 +193,7 @@ public class JobRegistryHelper { public void run() { int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue()); if (ret > 0) { - // fresh + // fresh (delete) freshGroupRegistryInfo(registryParam); } } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java index 1005c46c..234d3845 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java @@ -21,7 +21,12 @@ public interface XxlJobRegistryDao { public List findAll(@Param("timeout") int timeout, @Param("nowTime") Date nowTime); - public int registryUpdate(@Param("registryGroup") String registryGroup, + public int registrySaveOrUpdate(@Param("registryGroup") String registryGroup, + @Param("registryKey") String registryKey, + @Param("registryValue") String registryValue, + @Param("updateTime") Date updateTime); + + /*public int registryUpdate(@Param("registryGroup") String registryGroup, @Param("registryKey") String registryKey, @Param("registryValue") String registryValue, @Param("updateTime") Date updateTime); @@ -29,7 +34,7 @@ public interface XxlJobRegistryDao { public int registrySave(@Param("registryGroup") String registryGroup, @Param("registryKey") String registryKey, @Param("registryValue") String registryValue, - @Param("updateTime") Date updateTime); + @Param("updateTime") Date updateTime);*/ public int registryDelete(@Param("registryGroup") String registryGroup, @Param("registryKey") String registryKey, diff --git a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml index 4cae667a..aebdacc6 100644 --- a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml +++ b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml @@ -39,6 +39,14 @@ WHERE t.update_time ]]> DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND) + + INSERT INTO xxl_job_registry( `registry_group` , `registry_key` , `registry_value`, `update_time`) + VALUES( #{registryGroup} , #{registryKey} , #{registryValue}, #{updateTime}) + ON DUPLICATE KEY UPDATE + `update_time` = #{updateTime} + + + DELETE FROM xxl_job_registry diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobRegistryDaoTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobRegistryDaoTest.java index 5c0a15d8..bd8fe9b9 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobRegistryDaoTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobRegistryDaoTest.java @@ -8,6 +8,7 @@ import javax.annotation.Resource; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.concurrent.TimeUnit; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class XxlJobRegistryDaoTest { @@ -17,14 +18,32 @@ public class XxlJobRegistryDaoTest { @Test public void test(){ - int ret = xxlJobRegistryDao.registryUpdate("g1", "k1", "v1", new Date()); + int ret = xxlJobRegistryDao.registrySaveOrUpdate("g1", "k1", "v1", new Date()); + /*int ret = xxlJobRegistryDao.registryUpdate("g1", "k1", "v1", new Date()); if (ret < 1) { ret = xxlJobRegistryDao.registrySave("g1", "k1", "v1", new Date()); - } + }*/ List list = xxlJobRegistryDao.findAll(1, new Date()); int ret2 = xxlJobRegistryDao.removeDead(Arrays.asList(1)); } + @Test + public void test2() throws InterruptedException { + for (int i = 0; i < 100; i++) { + new Thread(()->{ + int ret = xxlJobRegistryDao.registrySaveOrUpdate("g1", "k1", "v1", new Date()); + System.out.println(ret); + + /*int ret = xxlJobRegistryDao.registryUpdate("g1", "k1", "v1", new Date()); + if (ret < 1) { + ret = xxlJobRegistryDao.registrySave("g1", "k1", "v1", new Date()); + }*/ + }).start(); + } + + TimeUnit.SECONDS.sleep(10); + } + }