From cf3b07fa26e393d659b1c28498c430c587b5c471 Mon Sep 17 00:00:00 2001 From: Ady Liu Date: Tue, 14 Apr 2020 21:21:39 +0800 Subject: [PATCH 001/310] read less than 1MiB & 10000 lines of log file --- .../com/xxl/job/core/log/XxlJobFileAppender.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java index 3fa8c4de..a041ca4d 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java @@ -5,6 +5,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; +import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; @@ -156,16 +157,25 @@ public class XxlJobFileAppender { StringBuffer logContentBuffer = new StringBuffer(); int toLineNum = 0; LineNumberReader reader = null; + boolean isEnd = false; try { //reader = new LineNumberReader(new FileReader(logFile)); reader = new LineNumberReader(new InputStreamReader(new FileInputStream(logFile), "utf-8")); String line = null; - + long totalSize = 0; while ((line = reader.readLine())!=null) { toLineNum = reader.getLineNumber(); // [from, to], start as 1 if (toLineNum >= fromLineNum) { logContentBuffer.append(line).append("\n"); } + + totalSize += line.getBytes(StandardCharsets.UTF_8).length; + //read less than 1MiB & 10000 lines to hold on the netty or jvm memory + if(toLineNum > 10000 || totalSize > 1024*1024) { + logContentBuffer.append("******************** FILE IS TOO LARGE ********************"); + isEnd = true; + break; + } } } catch (IOException e) { logger.error(e.getMessage(), e); @@ -180,7 +190,7 @@ public class XxlJobFileAppender { } // result - LogResult logResult = new LogResult(fromLineNum, toLineNum, logContentBuffer.toString(), false); + LogResult logResult = new LogResult(fromLineNum, toLineNum, logContentBuffer.toString(), isEnd); return logResult; /* From a7a7f0d05c3b3173081b654af218929eb22fd57e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E5=AE=8F=E4=BC=9F?= Date: Tue, 13 Apr 2021 15:22:21 +0800 Subject: [PATCH 002/310] =?UTF-8?q?1.=20=E4=BF=AE=E5=A4=8D=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=BD=9C=E5=9C=A8=E5=8F=AF=E8=83=BD=E7=9A=84?= =?UTF-8?q?bug=EF=BC=8C=E5=BD=93=E6=9F=90=E6=9D=A1=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=9A=84executor=5Fparams=E4=B8=BAnull=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E4=BC=9A=E9=80=A0=E6=88=90NPE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xxl/job/core/handler/impl/ScriptJobHandler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java index 7e0cee44..10b74cf1 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java @@ -72,6 +72,10 @@ public class ScriptJobHandler extends IJobHandler { // script params:0=param、1=分片序号、2=分片总数 String[] scriptParams = new String[3]; + // 防止 XxlJobHelper.getJobParam() 为null,造成NPE + if (XxlJobHelper.getJobParam() == null) { + scriptParams[0] = ""; + } scriptParams[0] = XxlJobHelper.getJobParam(); scriptParams[1] = String.valueOf(XxlJobContext.getXxlJobContext().getShardIndex()); scriptParams[2] = String.valueOf(XxlJobContext.getXxlJobContext().getShardTotal()); From 1c84310299c339ea55bc57a82255d849f269c518 Mon Sep 17 00:00:00 2001 From: GaoJian Date: Fri, 14 May 2021 16:43:02 +0800 Subject: [PATCH 003/310] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E3=80=81=E4=BF=AE=E6=94=B9=20=E5=8E=BB?= =?UTF-8?q?=E9=99=A4JobHandler(executor=5Fhandler)=E7=9A=84=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xxl/job/admin/service/impl/XxlJobServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 530ee41c..0c99b41c 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 @@ -148,6 +148,8 @@ public class XxlJobServiceImpl implements XxlJobService { jobInfo.setAddTime(new Date()); jobInfo.setUpdateTime(new Date()); jobInfo.setGlueUpdatetime(new Date()); + // remove the whitespace + jobInfo.setExecutorHandler(jobInfo.getExecutorHandler().trim()); xxlJobInfoDao.save(jobInfo); if (jobInfo.getId() < 1) { return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail")) ); @@ -272,7 +274,8 @@ public class XxlJobServiceImpl implements XxlJobService { exists_jobInfo.setScheduleConf(jobInfo.getScheduleConf()); exists_jobInfo.setMisfireStrategy(jobInfo.getMisfireStrategy()); exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy()); - exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler()); + // remove the whitespace + exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler().trim()); exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam()); exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout()); From b41d8064d6baacdf940546dc87b744ff6a8778d6 Mon Sep 17 00:00:00 2001 From: lishihao4 Date: Tue, 13 Jul 2021 17:49:56 +0800 Subject: [PATCH 004/310] =?UTF-8?q?=E5=AD=98=E5=9C=A8sql=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E9=A3=8E=E9=99=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml index 7b3c3a3e..cb3d77b8 100644 --- a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml +++ b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml @@ -188,8 +188,8 @@ executor_handler = #{executorHandler}, executor_param = #{executorParam}, executor_block_strategy = #{executorBlockStrategy}, - executor_timeout = ${executorTimeout}, - executor_fail_retry_count = ${executorFailRetryCount}, + executor_timeout = #{executorTimeout}, + executor_fail_retry_count = #{executorFailRetryCount}, glue_type = #{glueType}, glue_source = #{glueSource}, glue_remark = #{glueRemark}, From 15d5367eb8d8ff1a95b78a58b3156d92c9fb9e95 Mon Sep 17 00:00:00 2001 From: zhumeng Date: Wed, 2 Nov 2022 14:46:24 +0800 Subject: [PATCH 005/310] =?UTF-8?q?=E6=AD=A4=E5=A4=84=E4=BD=BF=E7=94=A8Int?= =?UTF-8?q?eger.parseInt=E4=BB=A3=E6=9B=BFInteger.intValue=E5=87=8F?= =?UTF-8?q?=E5=B0=91=E8=A3=85=E7=AE=B1=E6=8B=86=E7=AE=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sample/frameless/config/FrameLessXxlJobConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/config/FrameLessXxlJobConfig.java b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/config/FrameLessXxlJobConfig.java index 1d882dc5..15d79555 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/config/FrameLessXxlJobConfig.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/config/FrameLessXxlJobConfig.java @@ -40,9 +40,9 @@ public class FrameLessXxlJobConfig { xxlJobExecutor.setAppname(xxlJobProp.getProperty("xxl.job.executor.appname")); xxlJobExecutor.setAddress(xxlJobProp.getProperty("xxl.job.executor.address")); xxlJobExecutor.setIp(xxlJobProp.getProperty("xxl.job.executor.ip")); - xxlJobExecutor.setPort(Integer.valueOf(xxlJobProp.getProperty("xxl.job.executor.port"))); + xxlJobExecutor.setPort(Integer.parseInt(xxlJobProp.getProperty("xxl.job.executor.port"))); xxlJobExecutor.setLogPath(xxlJobProp.getProperty("xxl.job.executor.logpath")); - xxlJobExecutor.setLogRetentionDays(Integer.valueOf(xxlJobProp.getProperty("xxl.job.executor.logretentiondays"))); + xxlJobExecutor.setLogRetentionDays(Integer.parseInt(xxlJobProp.getProperty("xxl.job.executor.logretentiondays"))); // registry job bean xxlJobExecutor.setXxlJobBeanList(Arrays.asList(new SampleXxlJob())); From 362af7d31d71b601634fd071e0ea40c98360ace3 Mon Sep 17 00:00:00 2001 From: hanfei Date: Wed, 24 May 2023 17:10:01 +0800 Subject: [PATCH 006/310] =?UTF-8?q?=E4=BF=AE=E5=A4=8DJobThread=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E5=90=8D=E7=A7=B0=E9=97=AE=E9=A2=98=EF=BC=8C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=89=93=E5=8D=B0=E6=A0=BC=E5=BC=8F=E4=BF=9D=E6=8C=81?= =?UTF-8?q?=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/xxl/job/core/thread/JobThread.java | 1 + 1 file changed, 1 insertion(+) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java index cf07a55a..7b7a223c 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java @@ -148,6 +148,7 @@ public class JobThread extends Thread{ } }); futureThread = new Thread(futureTask); + futureThread.setName(getName()); futureThread.start(); Boolean tempResult = futureTask.get(triggerParam.getExecutorTimeout(), TimeUnit.SECONDS); From c96cb6d41acab707db0a330800962cd0de456e95 Mon Sep 17 00:00:00 2001 From: leqiuhong Date: Wed, 17 Jul 2024 01:12:03 +0800 Subject: [PATCH 007/310] fix(job-thread): add synchronized block to avoid repeat trigger job Add synchronized block around triggerLogIdSet check and addition to ensure thread-safety and prevent repeated job triggers. This update modifies the JobThread class to handle concurrent access to triggerLogIdSet properly. --- .../java/com/xxl/job/core/thread/JobThread.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java index cf07a55a..68aaa5b1 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java @@ -59,13 +59,14 @@ public class JobThread extends Thread{ * @return */ public ReturnT pushTriggerQueue(TriggerParam triggerParam) { - // avoid repeat - if (triggerLogIdSet.contains(triggerParam.getLogId())) { - logger.info(">>>>>>>>>>> repeate trigger job, logId:{}", triggerParam.getLogId()); - return new ReturnT(ReturnT.FAIL_CODE, "repeate trigger job, logId:" + triggerParam.getLogId()); + // avoid repeat + synchronized (this){ + if (triggerLogIdSet.contains(triggerParam.getLogId())) { + logger.info(">>>>>>>>>>> repeate trigger job, logId:{}", triggerParam.getLogId()); + return new ReturnT(ReturnT.FAIL_CODE, "repeate trigger job, logId:" + triggerParam.getLogId()); + } + triggerLogIdSet.add(triggerParam.getLogId()); } - - triggerLogIdSet.add(triggerParam.getLogId()); triggerQueue.add(triggerParam); return ReturnT.SUCCESS; } From b1d1d01754a7ba2fa10e1bdcca2af4ea2f2924f9 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sat, 11 Jan 2025 15:14:53 +0800 Subject: [PATCH 008/310] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E8=87=B3=203.0.0-SNAPSHOT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 6 +++--- pom.xml | 2 +- xxl-job-admin/pom.xml | 2 +- xxl-job-admin/src/main/resources/i18n/message_en.properties | 2 +- .../src/main/resources/i18n/message_zh_CN.properties | 2 +- .../src/main/resources/i18n/message_zh_TC.properties | 2 +- xxl-job-core/pom.xml | 2 +- xxl-job-executor-samples/pom.xml | 2 +- .../xxl-job-executor-sample-frameless/pom.xml | 2 +- .../xxl-job-executor-sample-springboot/pom.xml | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 6984a1ad..cd66ca48 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2438,10 +2438,10 @@ public void execute() { - a、本次升级数据模型及通讯协议向前兼容,v2.4.*代码和系统可无缝升级;建议对比新旧版本数据库初始化脚本补充索引; - b、计划下个大版本升级 v3.0,将会基于 jdk17 与 springboot3.x 构建;版本v2.5.x将会继续维护,问题及漏洞将会及时跟进修复。 - ### 7.37 版本 v3.0.0 Release Notes[规划中] -- 14、[规划中]登陆态Token生成逻辑优化,混淆登陆时间属性,降低token泄漏风险; -- 15、[规划中]升级springboot3.x,解决2.x老版本漏洞类问题。注意,springboot3.x依赖jdk17; +- 1、[规划中]调度中心升级 SpringBoot3 + JDK17;解决SpringBoot2.x老版本漏洞问题; +- 2、[规划中]登陆态Token生成逻辑优化,混淆登陆时间属性,降低token泄漏风险; + ### TODO LIST - 1、调度隔离:调度中心针对不同执行器,各自维护不同的调度和远程触发组件。 diff --git a/pom.xml b/pom.xml index 7805cb52..c1b1c308 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.xuxueli xxl-job - 2.5.0 + 3.0.0-SNAPSHOT pom ${project.artifactId} diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index 16b36523..f554af4e 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 2.5.0 + 3.0.0-SNAPSHOT xxl-job-admin jar diff --git a/xxl-job-admin/src/main/resources/i18n/message_en.properties b/xxl-job-admin/src/main/resources/i18n/message_en.properties index 904a43e8..0adf70b5 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -1,6 +1,6 @@ admin_name=Scheduling Center admin_name_full=Distributed Task Scheduling Platform XXL-JOB -admin_version=2.5.0 +admin_version=3.0.0-SNAPSHOT admin_i18n=en ## system diff --git a/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties b/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties index d683d2bc..259e5f99 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties @@ -1,6 +1,6 @@ admin_name=任务调度中心 admin_name_full=分布式任务调度平台XXL-JOB -admin_version=2.5.0 +admin_version=3.0.0-SNAPSHOT admin_i18n= ## system diff --git a/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties b/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties index f428143b..c8bcc9ec 100755 --- a/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties @@ -1,6 +1,6 @@ admin_name=任務調度中心 admin_name_full=分布式任務調度平臺XXL-JOB -admin_version=2.5.0 +admin_version=3.0.0-SNAPSHOT admin_i18n= ## system diff --git a/xxl-job-core/pom.xml b/xxl-job-core/pom.xml index 1b89f93c..3701cd9d 100644 --- a/xxl-job-core/pom.xml +++ b/xxl-job-core/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 2.5.0 + 3.0.0-SNAPSHOT xxl-job-core jar diff --git a/xxl-job-executor-samples/pom.xml b/xxl-job-executor-samples/pom.xml index f9cd9caa..17e20600 100644 --- a/xxl-job-executor-samples/pom.xml +++ b/xxl-job-executor-samples/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 2.5.0 + 3.0.0-SNAPSHOT xxl-job-executor-samples pom diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml index de0c6650..ff4e6eda 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml +++ b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml @@ -6,7 +6,7 @@ com.xuxueli xxl-job-executor-samples - 2.5.0 + 3.0.0-SNAPSHOT xxl-job-executor-sample-frameless jar diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml index 58947b6c..e70e7af7 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml @@ -6,7 +6,7 @@ com.xuxueli xxl-job-executor-samples - 2.5.0 + 3.0.0-SNAPSHOT xxl-job-executor-sample-springboot jar From 7b23fd2a62c0fe6909d4bc55de09bba1a139d585 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sat, 11 Jan 2025 16:18:03 +0800 Subject: [PATCH 009/310] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=20SpringBoot3=20+=20JDK17=EF=BC=9B=E4=B8=BB?= =?UTF-8?q?=E8=A6=81=E8=80=83=E8=99=91=E5=88=B0SpringBoot2=E6=BC=8F?= =?UTF-8?q?=E6=B4=9E=E9=97=AE=E9=A2=98=E4=B8=94=E5=81=9C=E6=AD=A2=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 2 +- pom.xml | 12 ++++++------ .../xxl/job/admin/controller/IndexController.java | 8 ++++---- .../xxl/job/admin/controller/JobApiController.java | 4 ++-- .../xxl/job/admin/controller/JobCodeController.java | 4 ++-- .../xxl/job/admin/controller/JobGroupController.java | 4 ++-- .../xxl/job/admin/controller/JobInfoController.java | 4 ++-- .../xxl/job/admin/controller/JobLogController.java | 4 ++-- .../xxl/job/admin/controller/JobUserController.java | 4 ++-- .../controller/interceptor/CookieInterceptor.java | 8 ++++---- .../interceptor/PermissionInterceptor.java | 6 +++--- .../admin/controller/interceptor/WebMvcConfig.java | 3 +-- .../controller/resolver/WebExceptionResolver.java | 7 +++---- .../xxl/job/admin/core/alarm/impl/EmailJobAlarm.java | 2 +- .../xxl/job/admin/core/conf/XxlJobAdminConfig.java | 2 +- .../java/com/xxl/job/admin/core/util/CookieUtil.java | 6 +++--- .../com/xxl/job/admin/service/impl/LoginService.java | 6 +++--- .../job/admin/service/impl/XxlJobServiceImpl.java | 2 +- xxl-job-core/pom.xml | 9 ++++----- .../main/java/com/xxl/job/core/glue/GlueFactory.java | 6 ++++++ .../xxl/job/core/glue/impl/SpringGlueFactory.java | 6 ++---- 21 files changed, 55 insertions(+), 54 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index cd66ca48..be96f932 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2439,7 +2439,7 @@ public void execute() { - b、计划下个大版本升级 v3.0,将会基于 jdk17 与 springboot3.x 构建;版本v2.5.x将会继续维护,问题及漏洞将会及时跟进修复。 ### 7.37 版本 v3.0.0 Release Notes[规划中] -- 1、[规划中]调度中心升级 SpringBoot3 + JDK17;解决SpringBoot2.x老版本漏洞问题; +- 1、调度中心升级 SpringBoot3 + JDK17;主要考虑到SpringBoot2漏洞问题且停止维护。 - 2、[规划中]登陆态Token生成逻辑优化,混淆登陆时间属性,降低token泄漏风险; diff --git a/pom.xml b/pom.xml index c1b1c308..0eaff39d 100644 --- a/pom.xml +++ b/pom.xml @@ -21,8 +21,8 @@ UTF-8 UTF-8 UTF-8 - 1.8 - 1.8 + 17 + 17 true 3.3.1 @@ -31,15 +31,15 @@ 2.0.16 5.11.4 - 1.3.2 + 3.0.0 4.1.116.Final 2.11.0 - 5.3.39 - 2.7.18 + 6.2.1 + 3.4.1 - 2.3.2 + 3.0.4 9.1.0 4.0.24 diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java index ca965107..c6f165f3 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java @@ -4,6 +4,9 @@ import com.xxl.job.admin.controller.annotation.PermissionLimit; import com.xxl.job.admin.service.impl.LoginService; import com.xxl.job.admin.service.XxlJobService; import com.xxl.job.core.biz.model.ReturnT; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -15,9 +18,6 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.RedirectView; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; @@ -53,7 +53,7 @@ public class IndexController { @RequestMapping("/toLogin") @PermissionLimit(limit=false) - public ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response,ModelAndView modelAndView) { + public ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response, ModelAndView modelAndView) { if (loginService.ifLogin(request, response) != null) { modelAndView.setView(new RedirectView("/",true,false)); return modelAndView; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java index aa51e739..8d0f5669 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java @@ -8,14 +8,14 @@ import com.xxl.job.core.biz.model.RegistryParam; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.util.GsonTool; import com.xxl.job.core.util.XxlJobRemotingUtil; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import java.util.List; /** diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java index a0886da8..e0ba0e5b 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java @@ -8,13 +8,13 @@ import com.xxl.job.admin.dao.XxlJobInfoDao; import com.xxl.job.admin.dao.XxlJobLogGlueDao; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.glue.GlueTypeEnum; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import java.util.Date; import java.util.List; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java index 8e0c5a4d..982310f8 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -9,14 +9,14 @@ import com.xxl.job.admin.dao.XxlJobInfoDao; import com.xxl.job.admin.dao.XxlJobRegistryDao; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.enums.RegistryConfig; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import java.util.*; /** diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java index 77bb4b28..69e2a198 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java @@ -16,6 +16,8 @@ import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.glue.GlueTypeEnum; import com.xxl.job.core.util.DateUtil; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; @@ -24,8 +26,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import java.util.*; /** diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java index 221e2771..96588001 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -17,6 +17,8 @@ import com.xxl.job.core.biz.model.LogParam; import com.xxl.job.core.biz.model.LogResult; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.util.DateUtil; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; @@ -27,8 +29,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.util.HtmlUtils; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import java.util.Date; import java.util.HashMap; import java.util.List; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java index 32b607c3..32a3c2bd 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java @@ -8,6 +8,8 @@ import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.dao.XxlJobGroupDao; import com.xxl.job.admin.dao.XxlJobUserDao; import com.xxl.job.core.biz.model.ReturnT; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.util.DigestUtils; @@ -16,8 +18,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java index 930b9e8a..92af9da1 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java @@ -2,13 +2,13 @@ package com.xxl.job.admin.controller.interceptor; import com.xxl.job.admin.core.util.FtlUtil; import com.xxl.job.admin.core.util.I18nUtil; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.AsyncHandlerInterceptor; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.util.HashMap; /** @@ -21,7 +21,7 @@ public class CookieInterceptor implements AsyncHandlerInterceptor { @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, - ModelAndView modelAndView) throws Exception { + ModelAndView modelAndView) throws Exception { // cookie if (modelAndView!=null && request.getCookies()!=null && request.getCookies().length>0) { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java index c088edee..2a10432f 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java @@ -5,13 +5,13 @@ import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobUser; import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.service.impl.LoginService; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.AsyncHandlerInterceptor; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java index 0be6ba66..561be371 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java @@ -1,11 +1,10 @@ package com.xxl.job.admin.controller.interceptor; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import javax.annotation.Resource; - /** * web mvc config * diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java index 114407b6..dbc9cd21 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java @@ -3,6 +3,8 @@ package com.xxl.job.admin.controller.resolver; import com.xxl.job.admin.core.exception.XxlJobException; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.admin.core.util.JacksonUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -11,8 +13,6 @@ import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** @@ -25,8 +25,7 @@ public class WebExceptionResolver implements HandlerExceptionResolver { private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class); @Override - public ModelAndView resolveException(HttpServletRequest request, - HttpServletResponse response, Object handler, Exception ex) { + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { if (!(ex instanceof XxlJobException)) { logger.error("WebExceptionResolver:{}", ex); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java index 16e52184..04254b10 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java @@ -7,12 +7,12 @@ import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.core.biz.model.ReturnT; +import jakarta.mail.internet.MimeMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Component; -import javax.mail.internet.MimeMessage; import java.text.MessageFormat; import java.util.Arrays; import java.util.HashSet; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java index b48f469b..e5f4d8be 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java @@ -3,13 +3,13 @@ package com.xxl.job.admin.core.conf; import com.xxl.job.admin.core.alarm.JobAlarmer; import com.xxl.job.admin.core.scheduler.XxlJobScheduler; import com.xxl.job.admin.dao.*; +import jakarta.annotation.Resource; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Component; -import javax.annotation.Resource; import javax.sql.DataSource; import java.util.Arrays; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java index 34a898f3..16b58d00 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java @@ -1,8 +1,8 @@ package com.xxl.job.admin.core.util; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** * Cookie.Util diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/LoginService.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/LoginService.java index 49d799b3..e85923e3 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/LoginService.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/LoginService.java @@ -6,12 +6,12 @@ import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.core.util.JacksonUtil; import com.xxl.job.admin.dao.XxlJobUserDao; import com.xxl.job.core.biz.model.ReturnT; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import org.springframework.util.DigestUtils; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.math.BigInteger; /** 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 c3e8a14e..c8c9998d 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 @@ -18,11 +18,11 @@ import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.glue.GlueTypeEnum; import com.xxl.job.core.util.DateUtil; +import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import javax.annotation.Resource; import java.text.MessageFormat; import java.util.*; diff --git a/xxl-job-core/pom.xml b/xxl-job-core/pom.xml index 3701cd9d..18d0016a 100644 --- a/xxl-job-core/pom.xml +++ b/xxl-job-core/pom.xml @@ -51,14 +51,13 @@ ${slf4j-api.version} - + - javax.annotation - javax.annotation-api - ${javax.annotation-api.version} + jakarta.annotation + jakarta.annotation-api + ${jakarta.annotation-api.version} provided - \ No newline at end of file diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java b/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java index b727a851..da2037f4 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java @@ -21,6 +21,12 @@ public class GlueFactory { public static GlueFactory getInstance(){ return glueFactory; } + + /** + * refresh instance by type + * + * @param type 0-frameless, 1-spring; + */ public static void refreshInstance(int type){ if (type == 0) { glueFactory = new GlueFactory(); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/glue/impl/SpringGlueFactory.java b/xxl-job-core/src/main/java/com/xxl/job/core/glue/impl/SpringGlueFactory.java index 37e44d5f..e370bb7d 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/glue/impl/SpringGlueFactory.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/glue/impl/SpringGlueFactory.java @@ -2,13 +2,13 @@ package com.xxl.job.core.glue.impl; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import com.xxl.job.core.glue.GlueFactory; +import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.annotation.AnnotationUtils; -import javax.annotation.Resource; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -68,9 +68,7 @@ public class SpringGlueFactory extends GlueFactory { field.setAccessible(true); try { field.set(instance, fieldBean); - } catch (IllegalArgumentException e) { - logger.error(e.getMessage(), e); - } catch (IllegalAccessException e) { + } catch (Exception e) { logger.error(e.getMessage(), e); } } From d3a88e41cdf77ed52bdd961d7de7d9dd6f0b43a2 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sat, 11 Jan 2025 17:34:24 +0800 Subject: [PATCH 010/310] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=20SpringBoot3=20+=20JDK17=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 2 +- xxl-job-admin/pom.xml | 2 +- .../job/admin/controller/IndexController.java | 14 +++++----- .../admin/controller/JobCodeController.java | 9 +++++-- .../admin/controller/JobGroupController.java | 11 ++++---- .../admin/controller/JobInfoController.java | 27 ++++++++++++------- .../admin/controller/JobLogController.java | 24 ++++++++++------- .../admin/controller/JobUserController.java | 13 +++++---- .../interceptor/PermissionInterceptor.java | 16 +++++++++-- .../templates/common/common.macro.ftl | 4 +-- .../templates/joblog/joblog.index.ftl | 2 +- .../controller/JobInfoControllerTest.java | 3 +-- ...n.java => XxlJobFramelessApplication.java} | 4 +-- .../pom.xml | 2 +- 14 files changed, 85 insertions(+), 48 deletions(-) rename xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/{FramelessApplication.java => XxlJobFramelessApplication.java} (86%) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index be96f932..4f2f9717 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2439,7 +2439,7 @@ public void execute() { - b、计划下个大版本升级 v3.0,将会基于 jdk17 与 springboot3.x 构建;版本v2.5.x将会继续维护,问题及漏洞将会及时跟进修复。 ### 7.37 版本 v3.0.0 Release Notes[规划中] -- 1、调度中心升级 SpringBoot3 + JDK17;主要考虑到SpringBoot2漏洞问题且停止维护。 +- 1、调度中心升级 SpringBoot3 + JDK17。 - 2、[规划中]登陆态Token生成逻辑优化,混淆登陆时间属性,降低token泄漏风险; diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index f554af4e..8c3c6092 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -84,7 +84,7 @@ org.springframework.boot spring-boot-maven-plugin - ${spring-boot.version} + diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java index c6f165f3..56765ae6 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java @@ -11,10 +11,7 @@ import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.InitBinder; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.RedirectView; @@ -46,7 +43,7 @@ public class IndexController { @RequestMapping("/chartInfo") @ResponseBody - public ReturnT> chartInfo(Date startDate, Date endDate) { + public ReturnT> chartInfo(@RequestParam("startDate") Date startDate, @RequestParam("endDate") Date endDate) { ReturnT> chartInfo = xxlJobService.chartInfo(startDate, endDate); return chartInfo; } @@ -64,7 +61,12 @@ public class IndexController { @RequestMapping(value="login", method=RequestMethod.POST) @ResponseBody @PermissionLimit(limit=false) - public ReturnT loginDo(HttpServletRequest request, HttpServletResponse response, String userName, String password, String ifRemember){ + public ReturnT loginDo(HttpServletRequest request, + HttpServletResponse response, + @RequestParam("userName") String userName, + @RequestParam("password") String password, + @RequestParam(value = "ifRemember", required = false) String ifRemember){ + boolean ifRem = (ifRemember!=null && ifRemember.trim().length()>0 && "on".equals(ifRemember))?true:false; return loginService.login(request, response, userName, password, ifRem); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java index e0ba0e5b..bfcac94f 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java @@ -13,6 +13,7 @@ import jakarta.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.util.Date; @@ -32,7 +33,7 @@ public class JobCodeController { private XxlJobLogGlueDao xxlJobLogGlueDao; @RequestMapping - public String index(HttpServletRequest request, Model model, int jobId) { + public String index(HttpServletRequest request, Model model, @RequestParam("jobId") int jobId) { XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); List jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId); @@ -56,7 +57,11 @@ public class JobCodeController { @RequestMapping("/save") @ResponseBody - public ReturnT save(HttpServletRequest request, int id, String glueSource, String glueRemark) { + public ReturnT save(HttpServletRequest request, + @RequestParam("id") int id, + @RequestParam("glueSource") String glueSource, + @RequestParam("glueRemark") String glueRemark) { + // valid if (glueRemark==null) { return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_glue_remark")) ); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java index 982310f8..5f96df9a 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -44,9 +44,10 @@ public class JobGroupController { @ResponseBody @PermissionLimit(adminuser = true) public Map pageList(HttpServletRequest request, - @RequestParam(required = false, defaultValue = "0") int start, - @RequestParam(required = false, defaultValue = "10") int length, - String appname, String title) { + @RequestParam(value = "start", required = false, defaultValue = "0") int start, + @RequestParam(value = "length", required = false, defaultValue = "10") int length, + @RequestParam("appname") String appname, + @RequestParam("title") String title) { // page query List list = xxlJobGroupDao.pageList(start, length, appname, title); @@ -176,7 +177,7 @@ public class JobGroupController { @RequestMapping("/remove") @ResponseBody @PermissionLimit(adminuser = true) - public ReturnT remove(int id){ + public ReturnT remove(@RequestParam("id") int id){ // valid int count = xxlJobInfoDao.pageListCount(0, 10, id, -1, null, null, null); @@ -196,7 +197,7 @@ public class JobGroupController { @RequestMapping("/loadById") @ResponseBody @PermissionLimit(adminuser = true) - public ReturnT loadById(int id){ + public ReturnT loadById(@RequestParam("id") int id){ XxlJobGroup jobGroup = xxlJobGroupDao.load(id); return jobGroup!=null?new ReturnT(jobGroup):new ReturnT(ReturnT.FAIL_CODE, null); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java index 69e2a198..cce6e7cd 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java @@ -43,7 +43,7 @@ public class JobInfoController { private XxlJobService xxlJobService; @RequestMapping - public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) { + public String index(HttpServletRequest request, Model model, @RequestParam(value = "jobGroup", required = false, defaultValue = "-1") int jobGroup) { // 枚举-字典 model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values()); // 路由策略-列表 @@ -69,9 +69,13 @@ public class JobInfoController { @RequestMapping("/pageList") @ResponseBody - public Map pageList(@RequestParam(required = false, defaultValue = "0") int start, - @RequestParam(required = false, defaultValue = "10") int length, - int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { + public Map pageList(@RequestParam(value = "start", required = false, defaultValue = "0") int start, + @RequestParam(value = "length", required = false, defaultValue = "10") int length, + @RequestParam("jobGroup") int jobGroup, + @RequestParam("triggerStatus") int triggerStatus, + @RequestParam("jobDesc") String jobDesc, + @RequestParam("executorHandler") String executorHandler, + @RequestParam("author") String author) { return xxlJobService.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); } @@ -100,25 +104,29 @@ public class JobInfoController { @RequestMapping("/remove") @ResponseBody - public ReturnT remove(int id) { + public ReturnT remove(@RequestParam("id") int id) { return xxlJobService.remove(id); } @RequestMapping("/stop") @ResponseBody - public ReturnT pause(int id) { + public ReturnT pause(@RequestParam("id") int id) { return xxlJobService.stop(id); } @RequestMapping("/start") @ResponseBody - public ReturnT start(int id) { + public ReturnT start(@RequestParam("id") int id) { return xxlJobService.start(id); } @RequestMapping("/trigger") @ResponseBody - public ReturnT triggerJob(HttpServletRequest request, int id, String executorParam, String addressList) { + public ReturnT triggerJob(HttpServletRequest request, + @RequestParam("id") int id, + @RequestParam("executorParam") String executorParam, + @RequestParam("addressList") String addressList) { + // login user XxlJobUser loginUser = PermissionInterceptor.getLoginUser(request); // trigger @@ -127,7 +135,8 @@ public class JobInfoController { @RequestMapping("/nextTriggerTime") @ResponseBody - public ReturnT> nextTriggerTime(String scheduleType, String scheduleConf) { + public ReturnT> nextTriggerTime(@RequestParam("scheduleType") String scheduleType, + @RequestParam("scheduleConf") String scheduleConf) { XxlJobInfo paramXxlJobInfo = new XxlJobInfo(); paramXxlJobInfo.setScheduleType(scheduleType); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java index 96588001..45df783d 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -51,7 +51,7 @@ public class JobLogController { public XxlJobLogDao xxlJobLogDao; @RequestMapping - public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) { + public String index(HttpServletRequest request, Model model, @RequestParam(value = "jobId", required = false, defaultValue = "0") Integer jobId) { // 执行器列表 List jobGroupList_all = xxlJobGroupDao.findAll(); @@ -82,7 +82,7 @@ public class JobLogController { @RequestMapping("/getJobsByGroup") @ResponseBody - public ReturnT> getJobsByGroup(int jobGroup){ + public ReturnT> getJobsByGroup(@RequestParam("jobGroup") int jobGroup){ List list = xxlJobInfoDao.getJobsByGroup(jobGroup); return new ReturnT>(list); } @@ -90,9 +90,12 @@ public class JobLogController { @RequestMapping("/pageList") @ResponseBody public Map pageList(HttpServletRequest request, - @RequestParam(required = false, defaultValue = "0") int start, - @RequestParam(required = false, defaultValue = "10") int length, - int jobGroup, int jobId, int logStatus, String filterTime) { + @RequestParam(value = "start", required = false, defaultValue = "0") int start, + @RequestParam(value = "length", required = false, defaultValue = "10") int length, + @RequestParam("jobGroup") int jobGroup, + @RequestParam("jobId") int jobId, + @RequestParam("logStatus") int logStatus, + @RequestParam("filterTime") String filterTime) { // valid permission PermissionInterceptor.validJobGroupPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup @@ -121,7 +124,7 @@ public class JobLogController { } @RequestMapping("/logDetailPage") - public String logDetailPage(int id, Model model){ + public String logDetailPage(@RequestParam("id") int id, Model model){ // base check ReturnT logStatue = ReturnT.SUCCESS; @@ -138,7 +141,7 @@ public class JobLogController { @RequestMapping("/logDetailCat") @ResponseBody - public ReturnT logDetailCat(long logId, int fromLineNum){ + public ReturnT logDetailCat(@RequestParam("logId") long logId, @RequestParam("fromLineNum") int fromLineNum){ try { // valid XxlJobLog jobLog = xxlJobLogDao.load(logId); // todo, need to improve performance @@ -173,7 +176,7 @@ public class JobLogController { @RequestMapping("/logKill") @ResponseBody - public ReturnT logKill(int id){ + public ReturnT logKill(@RequestParam("id") int id){ // base check XxlJobLog log = xxlJobLogDao.load(id); XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId()); @@ -207,7 +210,10 @@ public class JobLogController { @RequestMapping("/clearLog") @ResponseBody - public ReturnT clearLog(HttpServletRequest request, int jobGroup, int jobId, int type){ + public ReturnT clearLog(HttpServletRequest request, + @RequestParam("jobGroup") int jobGroup, + @RequestParam("jobId") int jobId, + @RequestParam("type") int type){ // valid permission PermissionInterceptor.validJobGroupPermission(request, jobGroup); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java index 32a3c2bd..a3c189f7 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java @@ -48,9 +48,10 @@ public class JobUserController { @RequestMapping("/pageList") @ResponseBody @PermissionLimit(adminuser = true) - public Map pageList(@RequestParam(required = false, defaultValue = "0") int start, - @RequestParam(required = false, defaultValue = "10") int length, - String username, int role) { + public Map pageList(@RequestParam(value = "start", required = false, defaultValue = "0") int start, + @RequestParam(value = "length", required = false, defaultValue = "10") int length, + @RequestParam("username") String username, + @RequestParam("role") int role) { // page list List list = xxlJobUserDao.pageList(start, length, username, role); @@ -137,7 +138,7 @@ public class JobUserController { @RequestMapping("/remove") @ResponseBody @PermissionLimit(adminuser = true) - public ReturnT remove(HttpServletRequest request, int id) { + public ReturnT remove(HttpServletRequest request, @RequestParam("id") int id) { // avoid opt login seft XxlJobUser loginUser = PermissionInterceptor.getLoginUser(request); @@ -151,7 +152,9 @@ public class JobUserController { @RequestMapping("/updatePwd") @ResponseBody - public ReturnT updatePwd(HttpServletRequest request, String password, String oldPassword){ + public ReturnT updatePwd(HttpServletRequest request, + @RequestParam("password") String password, + @RequestParam("oldPassword") String oldPassword){ // valid if (oldPassword==null || oldPassword.trim().length()==0){ diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java index 2a10432f..95e902d9 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java @@ -54,7 +54,9 @@ public class PermissionInterceptor implements AsyncHandlerInterceptor { if (needAdminuser && loginUser.getRole()!=1) { throw new RuntimeException(I18nUtil.getString("system_permission_limit")); } - request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser); // set loginUser, with request + + // set loginUser, with request + setLoginUser(request, loginUser); } return true; // proceed with the next interceptor @@ -63,6 +65,16 @@ public class PermissionInterceptor implements AsyncHandlerInterceptor { // -------------------- permission tool -------------------- + /** + * set loginUser + * + * @param request + * @param loginUser + */ + private static void setLoginUser(HttpServletRequest request, XxlJobUser loginUser){ + request.setAttribute("loginUser", loginUser); + } + /** * get loginUser * @@ -70,7 +82,7 @@ public class PermissionInterceptor implements AsyncHandlerInterceptor { * @return */ public static XxlJobUser getLoginUser(HttpServletRequest request){ - XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); // get loginUser, with request + XxlJobUser loginUser = (XxlJobUser) request.getAttribute("loginUser"); // get loginUser, with request return loginUser; } diff --git a/xxl-job-admin/src/main/resources/templates/common/common.macro.ftl b/xxl-job-admin/src/main/resources/templates/common/common.macro.ftl index 588f7494..1a61dd39 100644 --- a/xxl-job-admin/src/main/resources/templates/common/common.macro.ftl +++ b/xxl-job-admin/src/main/resources/templates/common/common.macro.ftl @@ -84,7 +84,7 @@ <#-- login user -->
  • '+ I18n.jobinfo_opt_stop +'
  • \n'; - } else { - start_stop_div = '
  • '+ I18n.jobinfo_opt_start +'
  • \n'; - } - - // job_next_time_html - var job_next_time_html = ''; - if (row.scheduleType == 'CRON' || row.scheduleType == 'FIX_RATE') { - job_next_time_html = '
  • ' + I18n.jobinfo_opt_next_time + '
  • \n'; - } - - // log url - var logHref = base_url +'/joblog?jobId='+ row.id; - - // code url - var codeBtn = ""; - if ('BEAN' != row.glueType) { - var codeUrl = base_url +'/jobcode?jobId='+ row.id; - codeBtn = '
  • GLUE IDE
  • \n'; - codeBtn += '
  • \n'; - } - - // data - tableData['key'+row.id] = row; - - // opt - var html = '
    \n' + - ' \n' + - ' \n' + - ' \n' + - '
    '; - - return html; - }; - } - } - ], - "language" : { - "sProcessing" : I18n.dataTable_sProcessing , - "sLengthMenu" : I18n.dataTable_sLengthMenu , - "sZeroRecords" : I18n.dataTable_sZeroRecords , - "sInfo" : I18n.dataTable_sInfo , - "sInfoEmpty" : I18n.dataTable_sInfoEmpty , - "sInfoFiltered" : I18n.dataTable_sInfoFiltered , - "sInfoPostFix" : "", - "sSearch" : I18n.dataTable_sSearch , - "sUrl" : "", - "sEmptyTable" : I18n.dataTable_sEmptyTable , - "sLoadingRecords" : I18n.dataTable_sLoadingRecords , - "sInfoThousands" : ",", - "oPaginate" : { - "sFirst" : I18n.dataTable_sFirst , - "sPrevious" : I18n.dataTable_sPrevious , - "sNext" : I18n.dataTable_sNext , - "sLast" : I18n.dataTable_sLast - }, - "oAria" : { - "sSortAscending" : I18n.dataTable_sSortAscending , - "sSortDescending" : I18n.dataTable_sSortDescending - } - } - }); - - // table data - var tableData = {}; - - // search btn - $('#searchBtn').on('click', function(){ - jobTable.fnDraw(); - }); - - // jobGroup change - $('#jobGroup').on('change', function(){ - //reload - var jobGroup = $('#jobGroup').val(); - window.location.href = base_url + "/jobinfo?jobGroup=" + jobGroup; - }); - - // job operate - $("#job_list").on('click', '.job_operate',function() { - var typeName; - var url; - var needFresh = false; - - var type = $(this).attr("_type"); - if ("job_pause" == type) { - typeName = I18n.jobinfo_opt_stop ; - url = base_url + "/jobinfo/stop"; - needFresh = true; - } else if ("job_resume" == type) { - typeName = I18n.jobinfo_opt_start ; - url = base_url + "/jobinfo/start"; - needFresh = true; - } else if ("job_del" == type) { - typeName = I18n.system_opt_del ; - url = base_url + "/jobinfo/remove"; - needFresh = true; - } else { - return; - } - - var id = $(this).parents('ul').attr("_id"); - - layer.confirm( I18n.system_ok + typeName + '?', { - icon: 3, - title: I18n.system_tips , - btn: [ I18n.system_ok, I18n.system_cancel ] - }, function(index){ - layer.close(index); - - $.ajax({ - type : 'POST', - url : url, - data : { - "id" : id - }, - dataType : "json", - success : function(data){ - if (data.code == 200) { - layer.msg( typeName + I18n.system_success ); - if (needFresh) { - //window.location.reload(); - jobTable.fnDraw(false); - } - } else { - layer.msg( data.msg || typeName + I18n.system_fail ); - } - } - }); - }); - }); - - // job trigger - $("#job_list").on('click', '.job_trigger',function() { - var id = $(this).parents('ul').attr("_id"); - var row = tableData['key'+id]; - - $("#jobTriggerModal .form input[name='id']").val( row.id ); - $("#jobTriggerModal .form textarea[name='executorParam']").val( row.executorParam ); - - $('#jobTriggerModal').modal({backdrop: false, keyboard: false}).modal('show'); - }); - $("#jobTriggerModal .ok").on('click',function() { - $.ajax({ - type : 'POST', - url : base_url + "/jobinfo/trigger", - data : { - "id" : $("#jobTriggerModal .form input[name='id']").val(), - "executorParam" : $("#jobTriggerModal .textarea[name='executorParam']").val(), - "addressList" : $("#jobTriggerModal .textarea[name='addressList']").val() - }, - dataType : "json", - success : function(data){ - if (data.code == 200) { - $('#jobTriggerModal').modal('hide'); - - layer.msg( I18n.jobinfo_opt_run + I18n.system_success ); - } else { - layer.msg( data.msg || I18n.jobinfo_opt_run + I18n.system_fail ); - } - } - }); - }); - $("#jobTriggerModal").on('hide.bs.modal', function () { - $("#jobTriggerModal .form")[0].reset(); - }); - - - // job registryinfo - $("#job_list").on('click', '.job_registryinfo',function() { - var id = $(this).parents('ul').attr("_id"); - var row = tableData['key'+id]; - - var jobGroup = row.jobGroup; - - $.ajax({ - type : 'POST', - url : base_url + "/jobgroup/loadById", - data : { - "id" : jobGroup - }, - dataType : "json", - success : function(data){ - - var html = '
    '; - if (data.code == 200 && data.data.registryList) { - for (var index in data.data.registryList) { - html += (parseInt(index)+1) + '. ' + data.data.registryList[index] + '
    '; - } - } - html += '
    '; - - layer.open({ - title: I18n.jobinfo_opt_registryinfo , - btn: [ I18n.system_ok ], - content: html - }); - - } - }); - - }); - - // job_next_time - $("#job_list").on('click', '.job_next_time',function() { - var id = $(this).parents('ul').attr("_id"); - var row = tableData['key'+id]; - - $.ajax({ - type : 'POST', - url : base_url + "/jobinfo/nextTriggerTime", - data : { - "scheduleType" : row.scheduleType, - "scheduleConf" : row.scheduleConf - }, - dataType : "json", - success : function(data){ - - if (data.code != 200) { - layer.open({ - title: I18n.jobinfo_opt_next_time , - btn: [ I18n.system_ok ], - content: data.msg - }); - } else { - var html = '
    '; - if (data.code == 200 && data.data) { - for (var index in data.data) { - html += '' + data.data[index] + '
    '; - } - } - html += '
    '; - - layer.open({ - title: I18n.jobinfo_opt_next_time , - btn: [ I18n.system_ok ], - content: html - }); - } - - } - }); - - }); - - // add - $(".add").click(function(){ - - // init-cronGen - $("#addModal .form input[name='schedule_conf_CRON']").show().siblings().remove(); - $("#addModal .form input[name='schedule_conf_CRON']").cronGen({}); - - // 》init scheduleType - $("#updateModal .form select[name=scheduleType]").change(); - - // 》init glueType - $("#updateModal .form select[name=glueType]").change(); - - $('#addModal').modal({backdrop: false, keyboard: false}).modal('show'); - }); - var addModalValidate = $("#addModal .form").validate({ - errorElement : 'span', - errorClass : 'help-block', - focusInvalid : true, - rules : { - jobDesc : { - required : true, - maxlength: 50 - }, - author : { - required : true - }/*, - executorTimeout : { - digits:true - }, - executorFailRetryCount : { - digits:true - }*/ - }, - messages : { - jobDesc : { - required : I18n.system_please_input + I18n.jobinfo_field_jobdesc - }, - author : { - required : I18n.system_please_input + I18n.jobinfo_field_author - }/*, - executorTimeout : { - digits: I18n.system_please_input + I18n.system_digits - }, - executorFailRetryCount : { - digits: I18n.system_please_input + I18n.system_digits - }*/ - }, - highlight : function(element) { - $(element).closest('.form-group').addClass('has-error'); - }, - success : function(label) { - label.closest('.form-group').removeClass('has-error'); - label.remove(); - }, - errorPlacement : function(error, element) { - element.parent('div').append(error); - }, - submitHandler : function(form) { - - // process executorTimeout+executorFailRetryCount - var executorTimeout = $("#addModal .form input[name='executorTimeout']").val(); - if(!/^\d+$/.test(executorTimeout)) { - executorTimeout = 0; - } - $("#addModal .form input[name='executorTimeout']").val(executorTimeout); - var executorFailRetryCount = $("#addModal .form input[name='executorFailRetryCount']").val(); - if(!/^\d+$/.test(executorFailRetryCount)) { - executorFailRetryCount = 0; - } - $("#addModal .form input[name='executorFailRetryCount']").val(executorFailRetryCount); - - // process schedule_conf - var scheduleType = $("#addModal .form select[name='scheduleType']").val(); - var scheduleConf; - if (scheduleType == 'CRON') { - scheduleConf = $("#addModal .form input[name='cronGen_display']").val(); - } else if (scheduleType == 'FIX_RATE') { - scheduleConf = $("#addModal .form input[name='schedule_conf_FIX_RATE']").val(); - } else if (scheduleType == 'FIX_DELAY') { - scheduleConf = $("#addModal .form input[name='schedule_conf_FIX_DELAY']").val(); - } - $("#addModal .form input[name='scheduleConf']").val( scheduleConf ); - - $.post(base_url + "/jobinfo/add", $("#addModal .form").serialize(), function(data, status) { - if (data.code == "200") { - $('#addModal').modal('hide'); - layer.open({ - title: I18n.system_tips , - btn: [ I18n.system_ok ], - content: I18n.system_add_suc , - icon: '1', - end: function(layero, index){ - jobTable.fnDraw(); - //window.location.reload(); - } - }); - } else { - layer.open({ - title: I18n.system_tips , - btn: [ I18n.system_ok ], - content: (data.msg || I18n.system_add_fail), - icon: '2' - }); - } - }); - } - }); - $("#addModal").on('hide.bs.modal', function () { - addModalValidate.resetForm(); - $("#addModal .form")[0].reset(); - $("#addModal .form .form-group").removeClass("has-error"); - $(".remote_panel").show(); // remote - - $("#addModal .form input[name='executorHandler']").removeAttr("readonly"); - }); - - // scheduleType change - $(".scheduleType").change(function(){ - var scheduleType = $(this).val(); - $(this).parents("form").find(".schedule_conf").hide(); - $(this).parents("form").find(".schedule_conf_" + scheduleType).show(); - - }); - - // glueType change - $(".glueType").change(function(){ - // executorHandler - var $executorHandler = $(this).parents("form").find("input[name='executorHandler']"); - var glueType = $(this).val(); - if ('BEAN' != glueType) { - $executorHandler.val(""); - $executorHandler.attr("readonly","readonly"); - } else { - $executorHandler.removeAttr("readonly"); - } - }); - - $("#addModal .glueType").change(function(){ - // glueSource - var glueType = $(this).val(); - if ('GLUE_GROOVY'==glueType){ - $("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_java").val() ); - } else if ('GLUE_SHELL'==glueType){ - $("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_shell").val() ); - } else if ('GLUE_PYTHON'==glueType){ - $("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_python").val() ); - } else if ('GLUE_PYTHON2'==glueType){ - $("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_python2").val() ); - } else if ('GLUE_PHP'==glueType){ - $("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_php").val() ); - } else if ('GLUE_NODEJS'==glueType){ - $("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_nodejs").val() ); - } else if ('GLUE_POWERSHELL'==glueType){ - $("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_powershell").val() ); - } else { - $("#addModal .form textarea[name='glueSource']").val(""); - } - }); - - // update - $("#job_list").on('click', '.update',function() { - - var id = $(this).parents('ul').attr("_id"); - var row = tableData['key'+id]; - - // fill base - $("#updateModal .form input[name='id']").val( row.id ); - $('#updateModal .form select[name=jobGroup] option[value='+ row.jobGroup +']').prop('selected', true); - $("#updateModal .form input[name='jobDesc']").val( row.jobDesc ); - $("#updateModal .form input[name='author']").val( row.author ); - $("#updateModal .form input[name='alarmEmail']").val( row.alarmEmail ); - - // fill trigger - $('#updateModal .form select[name=scheduleType] option[value='+ row.scheduleType +']').prop('selected', true); - $("#updateModal .form input[name='scheduleConf']").val( row.scheduleConf ); - if (row.scheduleType == 'CRON') { - $("#updateModal .form input[name='schedule_conf_CRON']").val( row.scheduleConf ); - } else if (row.scheduleType == 'FIX_RATE') { - $("#updateModal .form input[name='schedule_conf_FIX_RATE']").val( row.scheduleConf ); - } else if (row.scheduleType == 'FIX_DELAY') { - $("#updateModal .form input[name='schedule_conf_FIX_DELAY']").val( row.scheduleConf ); - } - - // 》init scheduleType - $("#updateModal .form select[name=scheduleType]").change(); - - // fill job - $('#updateModal .form select[name=glueType] option[value='+ row.glueType +']').prop('selected', true); - $("#updateModal .form input[name='executorHandler']").val( row.executorHandler ); - $("#updateModal .form textarea[name='executorParam']").val( row.executorParam ); - - // 》init glueType - $("#updateModal .form select[name=glueType]").change(); - - // 》init-cronGen - $("#updateModal .form input[name='schedule_conf_CRON']").show().siblings().remove(); - $("#updateModal .form input[name='schedule_conf_CRON']").cronGen({}); - - // fill advanced - $('#updateModal .form select[name=executorRouteStrategy] option[value='+ row.executorRouteStrategy +']').prop('selected', true); - $("#updateModal .form input[name='childJobId']").val( row.childJobId ); - $('#updateModal .form select[name=misfireStrategy] option[value='+ row.misfireStrategy +']').prop('selected', true); - $('#updateModal .form select[name=executorBlockStrategy] option[value='+ row.executorBlockStrategy +']').prop('selected', true); - $("#updateModal .form input[name='executorTimeout']").val( row.executorTimeout ); - $("#updateModal .form input[name='executorFailRetryCount']").val( row.executorFailRetryCount ); - - // show - $('#updateModal').modal({backdrop: false, keyboard: false}).modal('show'); - }); - var updateModalValidate = $("#updateModal .form").validate({ - errorElement : 'span', - errorClass : 'help-block', - focusInvalid : true, - - rules : { - jobDesc : { - required : true, - maxlength: 50 - }, - author : { - required : true - } - }, - messages : { - jobDesc : { - required : I18n.system_please_input + I18n.jobinfo_field_jobdesc - }, - author : { - required : I18n.system_please_input + I18n.jobinfo_field_author - } - }, - highlight : function(element) { - $(element).closest('.form-group').addClass('has-error'); - }, - success : function(label) { - label.closest('.form-group').removeClass('has-error'); - label.remove(); - }, - errorPlacement : function(error, element) { - element.parent('div').append(error); - }, - submitHandler : function(form) { - - // process executorTimeout + executorFailRetryCount - var executorTimeout = $("#updateModal .form input[name='executorTimeout']").val(); - if(!/^\d+$/.test(executorTimeout)) { - executorTimeout = 0; - } - $("#updateModal .form input[name='executorTimeout']").val(executorTimeout); - var executorFailRetryCount = $("#updateModal .form input[name='executorFailRetryCount']").val(); - if(!/^\d+$/.test(executorFailRetryCount)) { - executorFailRetryCount = 0; - } - $("#updateModal .form input[name='executorFailRetryCount']").val(executorFailRetryCount); - - - // process schedule_conf - var scheduleType = $("#updateModal .form select[name='scheduleType']").val(); - var scheduleConf; - if (scheduleType == 'CRON') { - scheduleConf = $("#updateModal .form input[name='cronGen_display']").val(); - } else if (scheduleType == 'FIX_RATE') { - scheduleConf = $("#updateModal .form input[name='schedule_conf_FIX_RATE']").val(); - } else if (scheduleType == 'FIX_DELAY') { - scheduleConf = $("#updateModal .form input[name='schedule_conf_FIX_DELAY']").val(); - } - $("#updateModal .form input[name='scheduleConf']").val( scheduleConf ); - - // post - $.post(base_url + "/jobinfo/update", $("#updateModal .form").serialize(), function(data, status) { - if (data.code == "200") { - $('#updateModal').modal('hide'); - layer.open({ - title: I18n.system_tips , - btn: [ I18n.system_ok ], - content: I18n.system_update_suc , - icon: '1', - end: function(layero, index){ - //window.location.reload(); - jobTable.fnDraw(); - } - }); - } else { - layer.open({ - title: I18n.system_tips , - btn: [ I18n.system_ok ], - content: (data.msg || I18n.system_update_fail ), - icon: '2' - }); - } - }); - } - }); - $("#updateModal").on('hide.bs.modal', function () { - updateModalValidate.resetForm(); - $("#updateModal .form")[0].reset(); - $("#updateModal .form .form-group").removeClass("has-error"); - }); - - /** - * find title by name, GlueType - */ - function findGlueTypeTitle(glueType) { - var glueTypeTitle; - $("#addModal .form select[name=glueType] option").each(function () { - var name = $(this).val(); - var title = $(this).text(); - if (glueType == name) { - glueTypeTitle = title; - return false - } - }); - return glueTypeTitle; - } - - // job_copy - $("#job_list").on('click', '.job_copy',function() { - - var id = $(this).parents('ul').attr("_id"); - var row = tableData['key'+id]; - - // fill base - $('#addModal .form select[name=jobGroup] option[value='+ row.jobGroup +']').prop('selected', true); - $("#addModal .form input[name='jobDesc']").val( row.jobDesc ); - $("#addModal .form input[name='author']").val( row.author ); - $("#addModal .form input[name='alarmEmail']").val( row.alarmEmail ); - - // fill trigger - $('#addModal .form select[name=scheduleType] option[value='+ row.scheduleType +']').prop('selected', true); - $("#addModal .form input[name='scheduleConf']").val( row.scheduleConf ); - if (row.scheduleType == 'CRON') { - $("#addModal .form input[name='schedule_conf_CRON']").val( row.scheduleConf ); - } else if (row.scheduleType == 'FIX_RATE') { - $("#addModal .form input[name='schedule_conf_FIX_RATE']").val( row.scheduleConf ); - } else if (row.scheduleType == 'FIX_DELAY') { - $("#addModal .form input[name='schedule_conf_FIX_DELAY']").val( row.scheduleConf ); - } - - // 》init scheduleType - $("#addModal .form select[name=scheduleType]").change(); - - // fill job - $('#addModal .form select[name=glueType] option[value='+ row.glueType +']').prop('selected', true); - $("#addModal .form input[name='executorHandler']").val( row.executorHandler ); - $("#addModal .form textarea[name='executorParam']").val( row.executorParam ); - - // 》init glueType - $("#addModal .form select[name=glueType]").change(); - - // 》init-cronGen - $("#addModal .form input[name='schedule_conf_CRON']").show().siblings().remove(); - $("#addModal .form input[name='schedule_conf_CRON']").cronGen({}); - - // fill advanced - $('#addModal .form select[name=executorRouteStrategy] option[value='+ row.executorRouteStrategy +']').prop('selected', true); - $("#addModal .form input[name='childJobId']").val( row.childJobId ); - $('#addModal .form select[name=misfireStrategy] option[value='+ row.misfireStrategy +']').prop('selected', true); - $('#addModal .form select[name=executorBlockStrategy] option[value='+ row.executorBlockStrategy +']').prop('selected', true); - $("#addModal .form input[name='executorTimeout']").val( row.executorTimeout ); - $("#addModal .form input[name='executorFailRetryCount']").val( row.executorFailRetryCount ); - - // show - $('#addModal').modal({backdrop: false, keyboard: false}).modal('show'); - }); - -}); From a63ffe7f420cb9d8e2abfcd793acb40e1d082b5b Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sun, 16 Nov 2025 23:58:37 +0800 Subject: [PATCH 184/310] =?UTF-8?q?feat(doc):=20=E6=9B=B4=E6=96=B0v3.2.1?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=91=E5=B8=83=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增执行器任务扫描排除路径配置项 - 升级调度中心UI框架,支持多主题与局部渲染 - 优化执行器任务Bean扫描逻辑,避免提前初始化 - 强化调度时间轮组件,确保任务不重不漏执行 - 优化任务调度锁逻辑,事务SQL下沉至Mapper层 - 优化报表统计SQL,修复null值查询问题 - 优化任务回调失败日志读写磁盘逻辑 - 升级Http通讯组件,基于接口代理方式重构 - 规范API交互协议,统一使用Response结构体 - 重构调度过期与调度类型策略逻辑 - 重构调度中心底层组件,统一初始化与销毁逻辑 - 模块化拆分调度中心底层组件,移除单例逻辑 - 修复脚本任务process销毁逻辑 - 调整调度预读任务数量,降低事务颗粒度 - 合并PR-2369,修复脚本任务参数取值问题 - 提升调度中心页面加载性能,移除不必要拦截器 - 强化通用HTTP任务,支持更丰富的请求参数 - 新增任务审计日志,记录敏感操作信息 - 升级多项maven依赖,包括springboot、mybatis等 - 完善调度组件日志,提升问题定位效率 --- doc/XXL-JOB官方文档.md | 44 ++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 67f2f458..7c8cd532 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2610,19 +2610,24 @@ public void execute() { - 15、【升级】升级多项maven依赖至较新版本,如 netty、groovy、mybatis、spring、spring-ai、dify 等; ### 7.41 版本 v3.2.1 Release Notes[规划中] -- 1、【新增】执行器新增“任务扫描排除路径”配置项(xxl.job.executor.excludedpackage),任务扫描时忽略指定包路径下的Bean;支持配置多个包路径、逗号分隔; -- 2、【优化】执行器任务Bean扫描逻辑调整,优化懒加载Bean检测及过滤机制,避免提前初始化类问题; -- 3、【优化】调度时间轮组件强化,保障不重不漏:调度时间轮单刻度数据去重,避免极端情况下任务重复执行;时间轮转动时校验临近刻度,避免极端情况下遗漏刻度; -- 4、【优化】任务调度锁逻辑优化,事务SQL下沉至Mapper层统一管理,并增加测试用例,提升代码可读性以及可维护性; -- 5、【优化】报表统计SQL优化,修复小概率情况下查询null值问题;报表初始化SQL优化,修复小概率情况增改竞争问题; -- 6、【优化】任务回调失败日志读写磁盘逻辑优化,解决极端情况下大文件读写内存问题; -- 7、【重构】调度过期策略、调度类型策略逻辑重构,代码组件化拆分并完善日志,提升健壮性及可维护性; -- 8、【重构】调度中心底层组件重构,组件初始化以及销毁逻辑统一处理,任务触发及和回调逻辑优化,避免资源泄漏风险; -- 9、【重构】调度中心底层组件模块化拆分,移除组件单例以及静态代码逻辑,提升组件可维护性; -- 10、【修复】脚本任务process销毁逻辑优化,解决风险情况下脚本进程无法终止问题; -- 11、【修复】调度预读任务数量调整,改为调度线程池大小x10,降低事务颗粒度,提升性能及稳定性; -- 12、【修复】合并PR-2369,修复脚本任务参数取值问题; -- 13、【强化】通用HTTP任务(httpJobHandler)强化,支持更丰富请求参数设置,完整参数示例如下: +- 1、【新增】执行器新增“任务扫描排除路径”配置项(xxl.job.executor.excludedpackage),任务扫描时忽略指定包路径下的任务; +- 2、【升级】调度中心UI框架升级,统一交互组件,支持多主题、多标签与局部渲染等,升级UI组件及性能; +- 3、【优化】执行器任务Bean扫描逻辑调整,优化懒加载Bean检测及过滤机制,避免提前初始化类问题; +- 4、【优化】调度时间轮组件强化,保障不重不漏:调度时间轮单刻度数据去重,避免极端情况下任务重复执行;时间轮转动时校验临近刻度,避免极端情况下遗漏刻度; +- 5、【优化】任务调度锁逻辑优化,事务SQL下沉至Mapper层统一管理,并增加测试用例,提升代码可读性以及可维护性; +- 6、【优化】报表统计SQL优化,修复小概率情况下查询null值问题;报表初始化SQL优化,修复小概率情况增改竞争问题; +- 7、【优化】任务回调失败日志读写磁盘逻辑优化,解决极端情况下大文件读写内存问题; +- 8、【升级】Http通讯组件升级,基于接口代理方式重构通讯组件,提升组件性能及扩展性; +- 9、【重构】规范API交互协议,通用响应结构体调整为Response,调度中心API统一为Response封装数据; + (注意:响应结构体从ReturnT升级为Response,其中属性值“content”会调整为“data”,取值逻辑需注意) +- 10、【重构】调度过期策略、调度类型策略逻辑重构,代码组件化拆分并完善日志,提升健壮性及可维护性; +- 11、【重构】调度中心底层组件重构,组件初始化以及销毁逻辑统一处理,任务触发及和回调逻辑优化,避免资源泄漏风险; +- 12、【重构】调度中心底层组件模块化拆分,移除组件单例以及静态代码逻辑,提升组件可维护性; +- 13、【修复】脚本任务process销毁逻辑优化,解决风险情况下脚本进程无法终止问题; +- 14、【修复】调度预读任务数量调整,改为调度线程池大小x10,降低事务颗粒度,提升性能及稳定性; +- 15、【修复】合并PR-2369,修复脚本任务参数取值问题; +- 16、【性能】调度中心调整资源加载逻辑,移除不必要的拦截器,提升页面加载性能; +- 17、【强化】通用HTTP任务(httpJobHandler)强化,支持更丰富请求参数设置,完整参数示例如下:
    完整参数示例参考: @@ -2646,18 +2651,11 @@ public void execute() { "auth": "auth data" } ``` -
    -- 14、【优化】调度组件日志完善,提升边界情况下问题定位效率; -- 15、【升级】升级多项maven依赖至较新版本,如 netty、groovy、spring、spring-ai、dify 等; -- 16、【重构】规范API交互协议,通用响应结构体调整为Response,调度中心API统一为Response封装数据; -(注意:响应结构体从ReturnT升级为Response,其中属性值“content”会调整为“data”,取值逻辑需注意) -- 17、【升级】Http通讯组件升级,基于接口代理方式重构通讯组件,提升组件性能及扩展性; + - 18、【新增】任务审计日志,记录任务操作敏感日志信息,如任务新建/更新/删除/启停/触发以及GLUE代码更新等,用于系统监控、审计和安全分析,可快速追溯异常行为以及定位排查问题等。 (当前任务审计日志以Info级别输出在系统日志中,可通过关键词 "xxl-job operation log:" 检索过滤) -- 19、【升级】升级多项maven依赖至较新版本,如 springboot、spring、mybatis、xxl-sso 等; -- 20、【ING】UI框架重构升级,提升交互体验; -- 21、【ING】调整资源加载逻辑,移除不必要的拦截器逻辑,提升页面加载效率; - +- 19、【优化】调度组件日志完善,提升边界情况下问题定位效率; +- 20、【升级】升级多项maven依赖至较新版本,如 netty、groovy、springboot、spring-ai、dify、mybatis、xxl-sso 等; ### TODO LIST From 951feed0b584e0a1a96f44893842823f67a4c978 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 17 Nov 2025 00:00:50 +0800 Subject: [PATCH 185/310] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=89=88=E6=9C=AC=E8=87=B3=20v3.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新主项目 pom.xml 版本号为 3.3.0-SNAPSHOT - 更新 xxl-job-admin 模块版本号为 3.3.0-SNAPSHOT - 更新 xxl-job-core 模块版本号为 3.3.0-SNAPSHOT - 更新所有 executor 示例模块版本号为 3.3.0-SNAPSHOT - 更新国际化配置文件中的版本显示为 3.3.0-SNAPSHOT - 更新官方文档中的版本发布说明至 v3.3.0 --- doc/XXL-JOB官方文档.md | 2 +- pom.xml | 2 +- xxl-job-admin/pom.xml | 2 +- xxl-job-admin/src/main/resources/i18n/message_en.properties | 2 +- xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties | 2 +- xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties | 2 +- xxl-job-core/pom.xml | 2 +- xxl-job-executor-samples/pom.xml | 2 +- .../xxl-job-executor-sample-frameless/pom.xml | 2 +- .../xxl-job-executor-sample-springboot-ai/pom.xml | 2 +- .../xxl-job-executor-sample-springboot/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 7c8cd532..6f4af450 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2609,7 +2609,7 @@ public void execute() { - 14、【修复】IDOR越权问题修复,提升任务操作及日志管理安全性; - 15、【升级】升级多项maven依赖至较新版本,如 netty、groovy、mybatis、spring、spring-ai、dify 等; -### 7.41 版本 v3.2.1 Release Notes[规划中] +### 7.41 版本 v3.3.0 Release Notes[规划中] - 1、【新增】执行器新增“任务扫描排除路径”配置项(xxl.job.executor.excludedpackage),任务扫描时忽略指定包路径下的任务; - 2、【升级】调度中心UI框架升级,统一交互组件,支持多主题、多标签与局部渲染等,升级UI组件及性能; - 3、【优化】执行器任务Bean扫描逻辑调整,优化懒加载Bean检测及过滤机制,避免提前初始化类问题; diff --git a/pom.xml b/pom.xml index 37f57495..e8bc7f8f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.xuxueli xxl-job - 3.2.1-SNAPSHOT + 3.3.0-SNAPSHOT pom ${project.artifactId} diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index 8674c658..6eb65f6a 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 3.2.1-SNAPSHOT + 3.3.0-SNAPSHOT xxl-job-admin jar diff --git a/xxl-job-admin/src/main/resources/i18n/message_en.properties b/xxl-job-admin/src/main/resources/i18n/message_en.properties index c83556e0..e4e464d0 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -1,6 +1,6 @@ admin_name=Scheduling Center admin_name_full=Distributed Task Scheduling Platform|XXL-JOB -admin_version=3.2.1-SNAPSHOT +admin_version=3.3.0-SNAPSHOT admin_i18n=en ## system diff --git a/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties b/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties index 7b64ed73..759b1076 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties @@ -1,6 +1,6 @@ admin_name=任务调度中心 admin_name_full=分布式任务调度平台|XXL-JOB -admin_version=3.2.1-SNAPSHOT +admin_version=3.3.0-SNAPSHOT admin_i18n= ## system diff --git a/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties b/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties index f84d17e4..d2f8d100 100755 --- a/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties @@ -1,6 +1,6 @@ admin_name=任務調度中心 admin_name_full=分布式任務調度平臺|XXL-JOB -admin_version=3.2.1-SNAPSHOT +admin_version=3.3.0-SNAPSHOT admin_i18n= ## system diff --git a/xxl-job-core/pom.xml b/xxl-job-core/pom.xml index 164a746d..e1942830 100644 --- a/xxl-job-core/pom.xml +++ b/xxl-job-core/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 3.2.1-SNAPSHOT + 3.3.0-SNAPSHOT xxl-job-core jar diff --git a/xxl-job-executor-samples/pom.xml b/xxl-job-executor-samples/pom.xml index 61bb4cb9..7fbb4ee4 100644 --- a/xxl-job-executor-samples/pom.xml +++ b/xxl-job-executor-samples/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 3.2.1-SNAPSHOT + 3.3.0-SNAPSHOT xxl-job-executor-samples pom diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml index f0b2ea6f..9f7d4446 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml +++ b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml @@ -6,7 +6,7 @@ com.xuxueli xxl-job-executor-samples - 3.2.1-SNAPSHOT + 3.3.0-SNAPSHOT xxl-job-executor-sample-frameless jar diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/pom.xml index 01b5abef..f28a8a2a 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/pom.xml +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/pom.xml @@ -6,7 +6,7 @@ com.xuxueli xxl-job-executor-samples - 3.2.1-SNAPSHOT + 3.3.0-SNAPSHOT xxl-job-executor-sample-springboot-ai jar diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml index 5d5bcea6..c3f7452d 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml @@ -6,7 +6,7 @@ com.xuxueli xxl-job-executor-samples - 3.2.1-SNAPSHOT + 3.3.0-SNAPSHOT xxl-job-executor-sample-springboot jar From 198fb4270aa4377d55db8a62e397c8c62e9a2e38 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 17 Nov 2025 00:04:39 +0800 Subject: [PATCH 186/310] =?UTF-8?q?test(admin):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=AE=A1=E7=90=86=E6=B5=8B=E8=AF=95=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加jobManage测试用例 - 包含任务增删改查操作验证 - 覆盖jobAdd、jobUpdate、jobRemove、jobStart、jobStop功能点 --- .../src/test/java/com/xxl/job/openapi/AdminBizTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/xxl-job-admin/src/test/java/com/xxl/job/openapi/AdminBizTest.java b/xxl-job-admin/src/test/java/com/xxl/job/openapi/AdminBizTest.java index be1dc508..8df54297 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/openapi/AdminBizTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/openapi/AdminBizTest.java @@ -83,4 +83,11 @@ public class AdminBizTest { } + // ---------------------- job opt ---------------------- + + @Test + public void jobManage() throws Exception { + // jobAdd、jobUpdate、jobRemove、jobStart、jobStop + } + } From 5955263ce59074ddd9076ab75af7cd56c6bf069b Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 19 Nov 2025 13:27:57 +0800 Subject: [PATCH 187/310] =?UTF-8?q?docs(job):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=AE=98=E6=96=B9=E6=96=87=E6=A1=A3=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E9=94=99=E8=AF=AF=E9=A1=B5=E9=9D=A2=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改文档中关于API响应结构调整的说明,明确指出openapi交互需要注意字段变更 - 在错误页面模板中引入公共宏定义,并增加对Tab页打开情况的判断隐藏返回按钮 - 增加JavaScript工具函数isOpenWithTab用于检测当前是否在Tab中打开页面 - 更新无框架执行器配置类中的属性加载方式,使用PropTool工具类替换自定义实现 - 优化权限工具类中对登录信息额外数据的空值判断逻辑,增强代码健壮性 - 补充版本升级备注说明,包括数据模型兼容性和客户端依赖更新建议 --- doc/XXL-JOB官方文档.md | 5 ++- .../admin/util/JobGroupPermissionUtil.java | 4 ++- .../resources/static/biz/common/admin.util.js | 11 +++++- .../templates/common/common.errorpage.ftl | 17 ++++++++- .../config/FrameLessXxlJobConfig.java | 35 +++---------------- 5 files changed, 37 insertions(+), 35 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 6f4af450..bb7efb93 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2619,7 +2619,7 @@ public void execute() { - 7、【优化】任务回调失败日志读写磁盘逻辑优化,解决极端情况下大文件读写内存问题; - 8、【升级】Http通讯组件升级,基于接口代理方式重构通讯组件,提升组件性能及扩展性; - 9、【重构】规范API交互协议,通用响应结构体调整为Response,调度中心API统一为Response封装数据; - (注意:响应结构体从ReturnT升级为Response,其中属性值“content”会调整为“data”,取值逻辑需注意) + (注意:a)响应结构体从ReturnT升级为Response,其中属性值“content”会调整为“data”,通过openapi交互场景需要关注) - 10、【重构】调度过期策略、调度类型策略逻辑重构,代码组件化拆分并完善日志,提升健壮性及可维护性; - 11、【重构】调度中心底层组件重构,组件初始化以及销毁逻辑统一处理,任务触发及和回调逻辑优化,避免资源泄漏风险; - 12、【重构】调度中心底层组件模块化拆分,移除组件单例以及静态代码逻辑,提升组件可维护性; @@ -2657,6 +2657,9 @@ public void execute() { - 19、【优化】调度组件日志完善,提升边界情况下问题定位效率; - 20、【升级】升级多项maven依赖至较新版本,如 netty、groovy、springboot、spring-ai、dify、mybatis、xxl-sso 等; +**备注:** +a、本次升级数据模型向前兼容,v3.2.*版本可直接升级不需要进行数据调整; +b、本次升级针对客户端rollinglog依赖字段做规范约束,如不关注改功能 v2.4.* 及后续版本客户端可忽略,否则需要一并升级客户端版本; ### TODO LIST - 1、调度隔离:调度中心针对不同执行器,各自维护不同的调度和远程触发组件。 diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/util/JobGroupPermissionUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/util/JobGroupPermissionUtil.java index 39b1ff8d..08603fbb 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/util/JobGroupPermissionUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/util/JobGroupPermissionUtil.java @@ -51,7 +51,9 @@ public class JobGroupPermissionUtil { if (XxlSsoHelper.hasRole(loginInfoResponse.getData(), Consts.ADMIN_ROLE).isSuccess()) { return jobGroupListTotal; } else { - List jobGroups = (loginInfoResponse.getData().getExtraInfo()!=null && loginInfoResponse.getData().getExtraInfo().containsKey("jobGroups")) + List jobGroups = (loginInfoResponse.getData().getExtraInfo()!=null + && loginInfoResponse.getData().getExtraInfo().get("jobGroups")!=null + ) ? StringTool.split(loginInfoResponse.getData().getExtraInfo().get("jobGroups"), ",") :new ArrayList<>(); diff --git a/xxl-job-admin/src/main/resources/static/biz/common/admin.util.js b/xxl-job-admin/src/main/resources/static/biz/common/admin.util.js index 7a4d3467..ec91ba9b 100644 --- a/xxl-job-admin/src/main/resources/static/biz/common/admin.util.js +++ b/xxl-job-admin/src/main/resources/static/biz/common/admin.util.js @@ -34,5 +34,14 @@ $(function(){ } } } - + + // ---------------------- isOpenWithTab ---------------------- + + /** + * 是否在Tab中打开 + */ + window.isOpenWithTab = function () { + return !!window.parent.$.adminTab; + } + }); diff --git a/xxl-job-admin/src/main/resources/templates/common/common.errorpage.ftl b/xxl-job-admin/src/main/resources/templates/common/common.errorpage.ftl index 1b147586..9e81e419 100644 --- a/xxl-job-admin/src/main/resources/templates/common/common.errorpage.ftl +++ b/xxl-job-admin/src/main/resources/templates/common/common.errorpage.ftl @@ -1,6 +1,9 @@ + <#-- import macro --> + <#import "../common/common.macro.ftl" as netCommon> + Error