From 7ac8ae75f2b5b55d9f183d347b5b40bb2db4942b Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Tue, 9 Feb 2021 17:44:45 +0800 Subject: [PATCH 01/17] upgrade develop version --- doc/XXL-JOB官方文档.md | 11 ++++++----- doc/db/tables_xxl_job.sql | 2 +- pom.xml | 2 +- xxl-job-admin/pom.xml | 2 +- .../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 +- 11 files changed, 16 insertions(+), 15 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 0fd435d5..96087c43 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2136,19 +2136,20 @@ public void execute() { - 26、【修复】页面redirect跳转后https变为http问题修复; - 27、【修复】执行器日志清理优化,修复小概率下日志文件为空导致清理异常问题; - ### 7.32 版本 v2.4.0 Release Notes[规划中] - 1、【优化】[规划中]任务日志重构:一次调度只记录一条主任务,维护起止时间和状态。 - 普通任务:只记录一条主任务; - 广播任务:记录一条主任务,每个分片任务记录一条次任务,关联在主任务上; - 重试任务:失败时,新增主任务。所有调度记录,包括入口调度和重试调度,均挂载主任务上。 - 2、【优化】[规划中]分片任务:全部完成后才会出发后置节点; -- 3、[规划中]DAG流程任务 + +### 7.33 版本 v2.4.0 Release Notes[规划中] +- 1、[规划中]DAG流程任务 - DAG任务:支持参数传递,共享数据:DAG任务创建、管理,DAG任务日志查看、操作; - 子任务:废弃 -- 4、[规划中]多数据库支持,DAO层通过JPA实现,不限制数据库类型; -- 5、[规划中]告警增强:邮件告警 + webhook告警; -- 6、[规划中]安全强化:AccessToken动态生成、动态启停;控制调度、回调; +- 2、[规划中]多数据库支持,DAO层通过JPA实现,不限制数据库类型; +- 3、[规划中]告警增强:邮件告警 + webhook告警; +- 4、[规划中]安全强化:AccessToken动态生成、动态启停;控制调度、回调; ### TODO LIST - 1、任务分片路由:分片采用一致性Hash算法计算出尽量稳定的分片顺序,即使注册机器存在波动也不会引起分批分片顺序大的波动;目前采用IP自然排序,可以满足需求,待定; diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql index 02e4442a..a3202128 100644 --- a/doc/db/tables_xxl_job.sql +++ b/doc/db/tables_xxl_job.sql @@ -1,5 +1,5 @@ # -# XXL-JOB v2.3.0 +# XXL-JOB v2.3.1-SNAPSHOT # Copyright (c) 2015-present, xuxueli. CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci; diff --git a/pom.xml b/pom.xml index ac599310..6d2cac51 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.xuxueli xxl-job - 2.3.0 + 2.3.1-SNAPSHOT pom ${project.artifactId} diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index cd4bcf23..5ff4f5c8 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 2.3.0 + 2.3.1-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 8e7d8352..7d67636d 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.3.0 +admin_version=2.3.1-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 00ca50e1..4897a238 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.3.0 +admin_version=2.3.1-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 90bfc1aa..57d28e4f 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.3.0 +admin_version=2.3.1-SNAPSHOT admin_i18n= ## system diff --git a/xxl-job-core/pom.xml b/xxl-job-core/pom.xml index 70769714..48f3d50d 100644 --- a/xxl-job-core/pom.xml +++ b/xxl-job-core/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 2.3.0 + 2.3.1-SNAPSHOT xxl-job-core jar diff --git a/xxl-job-executor-samples/pom.xml b/xxl-job-executor-samples/pom.xml index ef1fba22..712daf11 100644 --- a/xxl-job-executor-samples/pom.xml +++ b/xxl-job-executor-samples/pom.xml @@ -5,7 +5,7 @@ com.xuxueli xxl-job - 2.3.0 + 2.3.1-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 50b23ed0..35993c29 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.3.0 + 2.3.1-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 9782a28d..16ac25c0 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.3.0 + 2.3.1-SNAPSHOT xxl-job-executor-sample-springboot jar From 1b582691906d0ac81e0a9eaf38840f606dd7712a Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Tue, 9 Feb 2021 17:48:33 +0800 Subject: [PATCH 02/17] upgrade doc --- doc/XXL-JOB官方文档.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 96087c43..d11d2a20 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2136,7 +2136,7 @@ public void execute() { - 26、【修复】页面redirect跳转后https变为http问题修复; - 27、【修复】执行器日志清理优化,修复小概率下日志文件为空导致清理异常问题; -### 7.32 版本 v2.4.0 Release Notes[规划中] +### 7.32 版本 v2.3.1 Release Notes[规划中] - 1、【优化】[规划中]任务日志重构:一次调度只记录一条主任务,维护起止时间和状态。 - 普通任务:只记录一条主任务; - 广播任务:记录一条主任务,每个分片任务记录一条次任务,关联在主任务上; From 1c505288e38945d7457d1fb63fcf3f2ad4520272 Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Sun, 25 Apr 2021 15:54:30 +0800 Subject: [PATCH 03/17] =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=8D=87=E7=BA=A7=E8=87=B3=E8=BE=83=E6=96=B0?= =?UTF-8?q?=E7=A8=B3=E5=AE=9A=E7=89=88=E6=9C=AC=EF=BC=8C=E5=A6=82netty?= =?UTF-8?q?=E3=80=81groovy=E3=80=81spring=E3=80=81springboot=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + pom.xml | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index d11d2a20..a5776672 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2142,6 +2142,7 @@ public void execute() { - 广播任务:记录一条主任务,每个分片任务记录一条次任务,关联在主任务上; - 重试任务:失败时,新增主任务。所有调度记录,包括入口调度和重试调度,均挂载主任务上。 - 2、【优化】[规划中]分片任务:全部完成后才会出发后置节点; +- 3、【优化】多个项目依赖升级至较新稳定版本,如netty、groovy、spring、springboot等; ### 7.33 版本 v2.4.0 Release Notes[规划中] - 1、[规划中]DAG流程任务 diff --git a/pom.xml b/pom.xml index 6d2cac51..21beafd8 100644 --- a/pom.xml +++ b/pom.xml @@ -24,20 +24,20 @@ 1.8 true - 4.1.58.Final + 4.1.63.Final 2.8.6 - 5.3.3 - 2.4.2 + 5.3.6 + 2.4.5 2.1.4 - 8.0.23 + 8.0.24 1.7.30 5.7.1 1.3.2 - 3.0.7 + 3.0.8 3.2.1 3.2.0 From ff73b1a56d8e16e6647cad68b44ccadad23bca1d Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Sun, 25 Apr 2021 15:58:09 +0800 Subject: [PATCH 04/17] upgrade version --- pom.xml | 2 +- .../xxl-job-executor-sample-frameless/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 21beafd8..f60aa5c1 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 8.0.24 1.7.30 - 5.7.1 + 5.7.1 1.3.2 3.0.8 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 35993c29..39482c54 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 @@ -28,7 +28,7 @@ org.junit.jupiter junit-jupiter-engine - ${junit.version} + ${junit-jupiter.version} test From 21ee9bf6da2de0779dd556dd7f93214cd4ddb46c Mon Sep 17 00:00:00 2001 From: lzh Date: Thu, 15 Jul 2021 14:38:14 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E5=85=B6=E5=AE=83=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E5=91=8A=E8=AD=A6=E4=B8=8D=E5=BF=85=E6=A0=A1=E9=AA=8C=E9=82=AE?= =?UTF-8?q?=E7=AE=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xxl/job/admin/core/thread/JobFailMonitorHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index 33e4d250..8409d7b3 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -60,7 +60,7 @@ public class JobFailMonitorHelper { // 2、fail alarm monitor int newAlarmStatus = 0; // 告警状态:0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败 - if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) { + if (info != null) { boolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, log); newAlarmStatus = alarmResult?2:3; } else { From 021daa0d76e8886a012a55634675bf8d30d8871d Mon Sep 17 00:00:00 2001 From: "zhengxin.ren" Date: Mon, 19 Jul 2021 10:40:20 +0800 Subject: [PATCH 06/17] fix XxlJobContext CODE spell error --- .../xxl/job/admin/core/complete/XxlJobCompleter.java | 2 +- .../test/java/com/xxl/job/adminbiz/AdminBizTest.java | 2 +- .../java/com/xxl/job/core/context/XxlJobContext.java | 8 ++++---- .../java/com/xxl/job/core/context/XxlJobHelper.java | 12 ++++++------ .../main/java/com/xxl/job/core/thread/JobThread.java | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java index b9ac59a3..279ad7d1 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java @@ -47,7 +47,7 @@ public class XxlJobCompleter { // 1、handle success, to trigger child job String triggerChildMsg = null; - if (XxlJobContext.HANDLE_COCE_SUCCESS == xxlJobLog.getHandleCode()) { + if (XxlJobContext.HANDLE_CODE_SUCCESS == xxlJobLog.getHandleCode()) { XxlJobInfo xxlJobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(xxlJobLog.getJobId()); if (xxlJobInfo!=null && xxlJobInfo.getChildJobId()!=null && xxlJobInfo.getChildJobId().trim().length()>0) { triggerChildMsg = "

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_child_run") +"<<<<<<<<<<<
"; diff --git a/xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java b/xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java index c33c6364..6fb89e7f 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java @@ -32,7 +32,7 @@ public class AdminBizTest { HandleCallbackParam param = new HandleCallbackParam(); param.setLogId(1); - param.setHandleCode(XxlJobContext.HANDLE_COCE_SUCCESS); + param.setHandleCode(XxlJobContext.HANDLE_CODE_SUCCESS); List callbackParamList = Arrays.asList(param); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java b/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java index 0657cf76..7e350129 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java @@ -8,9 +8,9 @@ package com.xxl.job.core.context; */ public class XxlJobContext { - public static final int HANDLE_COCE_SUCCESS = 200; - public static final int HANDLE_COCE_FAIL = 500; - public static final int HANDLE_COCE_TIMEOUT = 502; + public static final int HANDLE_CODE_SUCCESS = 200; + public static final int HANDLE_CODE_FAIL = 500; + public static final int HANDLE_CODE_TIMEOUT = 502; // ---------------------- base info ---------------------- @@ -68,7 +68,7 @@ public class XxlJobContext { this.shardIndex = shardIndex; this.shardTotal = shardTotal; - this.handleCode = HANDLE_COCE_SUCCESS; // default success + this.handleCode = HANDLE_CODE_SUCCESS; // default success } public long getJobId() { diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobHelper.java b/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobHelper.java index cec7f587..eb20c181 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobHelper.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobHelper.java @@ -177,7 +177,7 @@ public class XxlJobHelper { * @return */ public static boolean handleSuccess(){ - return handleResult(XxlJobContext.HANDLE_COCE_SUCCESS, null); + return handleResult(XxlJobContext.HANDLE_CODE_SUCCESS, null); } /** @@ -187,7 +187,7 @@ public class XxlJobHelper { * @return */ public static boolean handleSuccess(String handleMsg) { - return handleResult(XxlJobContext.HANDLE_COCE_SUCCESS, handleMsg); + return handleResult(XxlJobContext.HANDLE_CODE_SUCCESS, handleMsg); } /** @@ -196,7 +196,7 @@ public class XxlJobHelper { * @return */ public static boolean handleFail(){ - return handleResult(XxlJobContext.HANDLE_COCE_FAIL, null); + return handleResult(XxlJobContext.HANDLE_CODE_FAIL, null); } /** @@ -206,7 +206,7 @@ public class XxlJobHelper { * @return */ public static boolean handleFail(String handleMsg) { - return handleResult(XxlJobContext.HANDLE_COCE_FAIL, handleMsg); + return handleResult(XxlJobContext.HANDLE_CODE_FAIL, handleMsg); } /** @@ -215,7 +215,7 @@ public class XxlJobHelper { * @return */ public static boolean handleTimeout(){ - return handleResult(XxlJobContext.HANDLE_COCE_TIMEOUT, null); + return handleResult(XxlJobContext.HANDLE_CODE_TIMEOUT, null); } /** @@ -225,7 +225,7 @@ public class XxlJobHelper { * @return */ public static boolean handleTimeout(String handleMsg){ - return handleResult(XxlJobContext.HANDLE_COCE_TIMEOUT, handleMsg); + return handleResult(XxlJobContext.HANDLE_CODE_TIMEOUT, handleMsg); } /** 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 0ea04f0c..5c7553c1 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 @@ -215,7 +215,7 @@ public class JobThread extends Thread{ TriggerCallbackThread.pushCallBack(new HandleCallbackParam( triggerParam.getLogId(), triggerParam.getLogDateTime(), - XxlJobContext.HANDLE_COCE_FAIL, + XxlJobContext.HANDLE_CODE_FAIL, stopReason + " [job running, killed]" ) ); } @@ -231,7 +231,7 @@ public class JobThread extends Thread{ TriggerCallbackThread.pushCallBack(new HandleCallbackParam( triggerParam.getLogId(), triggerParam.getLogDateTime(), - XxlJobContext.HANDLE_COCE_FAIL, + XxlJobContext.HANDLE_CODE_FAIL, stopReason + " [job not executed, in the job queue, killed.]") ); } From 1d31733031e1ff896a804a29f33947340cdc17f2 Mon Sep 17 00:00:00 2001 From: Weihua Date: Sun, 1 Aug 2021 16:52:31 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E5=B0=8F=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E4=BB=BB=E4=BD=95=E5=8A=9F=E8=83=BD=E6=80=A7?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E5=92=8Cbug=E4=BF=AE=E5=A4=8D=EF=BC=8C?= =?UTF-8?q?=E5=B0=9D=E8=AF=95=E5=88=9D=E6=AC=A1pr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xxl/job/core/executor/XxlJobExecutor.java | 47 ++++++++++++++++ .../executor/impl/XxlJobSimpleExecutor.java | 54 +------------------ .../executor/impl/XxlJobSpringExecutor.java | 49 +---------------- .../service/jobhandler/SampleXxlJob.java | 22 +++++++- 4 files changed, 71 insertions(+), 101 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java index 945fded4..4fa2eea6 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java @@ -3,6 +3,8 @@ package com.xxl.job.core.executor; import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.client.AdminBizClient; import com.xxl.job.core.handler.IJobHandler; +import com.xxl.job.core.handler.annotation.XxlJob; +import com.xxl.job.core.handler.impl.MethodJobHandler; import com.xxl.job.core.log.XxlJobFileAppender; import com.xxl.job.core.server.EmbedServer; import com.xxl.job.core.thread.JobLogFileCleanThread; @@ -13,6 +15,7 @@ import com.xxl.job.core.util.NetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -110,6 +113,50 @@ public class XxlJobExecutor { } + protected void registerJobHandler(XxlJob xxlJob, Object bean, Method executeMethod){ + if (xxlJob == null) { + return; + } + + String name = xxlJob.value(); + //make and simplify the variables since they'll be called several times later + Class clazz = bean.getClass(); + String methodName = executeMethod.getName(); + if (name.trim().length() == 0) { + throw new RuntimeException("xxl-job method-jobhandler name invalid, for[" + clazz + "#" + methodName + "] ."); + } + if (loadJobHandler(name) != null) { + throw new RuntimeException("xxl-job jobhandler[" + name + "] naming conflicts."); + } + + executeMethod.setAccessible(true); + + // init and destroy + Method initMethod = null; + Method destroyMethod = null; + + if (xxlJob.init().trim().length() > 0) { + try { + initMethod = clazz.getDeclaredMethod(xxlJob.init()); + initMethod.setAccessible(true); + } catch (NoSuchMethodException e) { + throw new RuntimeException("xxl-job method-jobhandler initMethod invalid, for[" + clazz + "#" + methodName + "] ."); + } + } + if (xxlJob.destroy().trim().length() > 0) { + try { + destroyMethod = clazz.getDeclaredMethod(xxlJob.destroy()); + destroyMethod.setAccessible(true); + } catch (NoSuchMethodException e) { + throw new RuntimeException("xxl-job method-jobhandler destroyMethod invalid, for[" + clazz + "#" + methodName + "] ."); + } + } + + // registry jobhandler + registJobHandler(name, new MethodJobHandler(bean, executeMethod, initMethod, destroyMethod)); + + } + // ---------------------- admin-client (rpc invoker) ---------------------- private static List adminBizList; diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java index d1b413a3..b262f4a5 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java @@ -57,62 +57,12 @@ public class XxlJobSimpleExecutor extends XxlJobExecutor { for (Object bean: xxlJobBeanList) { // method Method[] methods = bean.getClass().getDeclaredMethods(); - if (methods==null || methods.length==0) { + if (methods.length == 0) { continue; } for (Method executeMethod : methods) { - - // anno XxlJob xxlJob = executeMethod.getAnnotation(XxlJob.class); - if (xxlJob == null) { - continue; - } - - String name = xxlJob.value(); - if (name.trim().length() == 0) { - throw new RuntimeException("xxl-job method-jobhandler name invalid, for[" + bean.getClass() + "#" + executeMethod.getName() + "] ."); - } - if (loadJobHandler(name) != null) { - throw new RuntimeException("xxl-job jobhandler[" + name + "] naming conflicts."); - } - - // execute method - /*if (!(method.getParameterTypes().length == 1 && method.getParameterTypes()[0].isAssignableFrom(String.class))) { - throw new RuntimeException("xxl-job method-jobhandler param-classtype invalid, for[" + bean.getClass() + "#" + method.getName() + "] , " + - "The correct method format like \" public ReturnT execute(String param) \" ."); - } - if (!method.getReturnType().isAssignableFrom(ReturnT.class)) { - throw new RuntimeException("xxl-job method-jobhandler return-classtype invalid, for[" + bean.getClass() + "#" + method.getName() + "] , " + - "The correct method format like \" public ReturnT execute(String param) \" ."); - }*/ - - executeMethod.setAccessible(true); - - // init and destory - Method initMethod = null; - Method destroyMethod = null; - - if (xxlJob.init().trim().length() > 0) { - try { - initMethod = bean.getClass().getDeclaredMethod(xxlJob.init()); - initMethod.setAccessible(true); - } catch (NoSuchMethodException e) { - throw new RuntimeException("xxl-job method-jobhandler initMethod invalid, for[" + bean.getClass() + "#" + executeMethod.getName() + "] ."); - } - } - if (xxlJob.destroy().trim().length() > 0) { - try { - destroyMethod = bean.getClass().getDeclaredMethod(xxlJob.destroy()); - destroyMethod.setAccessible(true); - } catch (NoSuchMethodException e) { - throw new RuntimeException("xxl-job method-jobhandler destroyMethod invalid, for[" + bean.getClass() + "#" + executeMethod.getName() + "] ."); - } - } - - // registry jobhandler - registJobHandler(name, new MethodJobHandler(bean, executeMethod, initMethod, destroyMethod)); - - + registerJobHandler(xxlJob, bean, executeMethod); } } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java index 0e689f41..2a6829ec 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java @@ -105,56 +105,9 @@ public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationC for (Map.Entry methodXxlJobEntry : annotatedMethods.entrySet()) { Method executeMethod = methodXxlJobEntry.getKey(); XxlJob xxlJob = methodXxlJobEntry.getValue(); - if (xxlJob == null) { - continue; - } - - String name = xxlJob.value(); - if (name.trim().length() == 0) { - throw new RuntimeException("xxl-job method-jobhandler name invalid, for[" + bean.getClass() + "#" + executeMethod.getName() + "] ."); - } - if (loadJobHandler(name) != null) { - throw new RuntimeException("xxl-job jobhandler[" + name + "] naming conflicts."); - } - - // execute method - /*if (!(method.getParameterTypes().length == 1 && method.getParameterTypes()[0].isAssignableFrom(String.class))) { - throw new RuntimeException("xxl-job method-jobhandler param-classtype invalid, for[" + bean.getClass() + "#" + method.getName() + "] , " + - "The correct method format like \" public ReturnT execute(String param) \" ."); - } - if (!method.getReturnType().isAssignableFrom(ReturnT.class)) { - throw new RuntimeException("xxl-job method-jobhandler return-classtype invalid, for[" + bean.getClass() + "#" + method.getName() + "] , " + - "The correct method format like \" public ReturnT execute(String param) \" ."); - }*/ - - executeMethod.setAccessible(true); - - // init and destory - Method initMethod = null; - Method destroyMethod = null; - - if (xxlJob.init().trim().length() > 0) { - try { - initMethod = bean.getClass().getDeclaredMethod(xxlJob.init()); - initMethod.setAccessible(true); - } catch (NoSuchMethodException e) { - throw new RuntimeException("xxl-job method-jobhandler initMethod invalid, for[" + bean.getClass() + "#" + executeMethod.getName() + "] ."); - } - } - if (xxlJob.destroy().trim().length() > 0) { - try { - destroyMethod = bean.getClass().getDeclaredMethod(xxlJob.destroy()); - destroyMethod.setAccessible(true); - } catch (NoSuchMethodException e) { - throw new RuntimeException("xxl-job method-jobhandler destroyMethod invalid, for[" + bean.getClass() + "#" + executeMethod.getName() + "] ."); - } - } - - // registry jobhandler - registJobHandler(name, new MethodJobHandler(bean, executeMethod, initMethod, destroyMethod)); + registerJobHandler(xxlJob, bean, executeMethod); } } - } // ---------------------- applicationContext ---------------------- diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java index 7ea8e52d..404416db 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java @@ -245,8 +245,28 @@ public class SampleXxlJob { public void init(){ logger.info("init"); } + public void destroy(){ - logger.info("destory"); + logger.info("destroy"); + } + + /** + * 6、生命周期任务示例:任务初始化与销毁时,支持private方法(但不推荐); + */ + @XxlJob(value = "demoJobHandler3", init = "initForDemoJobHandler3", destroy = "destroyForDemoJobHandler3") + public void demoJobHandler3() throws Exception { + XxlJobHelper.log("XXL-JOB, Hello World."); + } + + private void initForDemoJobHandler3(){ + logger.info("initForDemoJobHandler3"); + } + + /** + * 演示private方法也可以被访问且执行 + */ + public void destroyForDemoJobHandler3(){ + logger.info("destroyForDemoJobHandler3"); } From 54674714ea3012f9ef754b665b86add54c695731 Mon Sep 17 00:00:00 2001 From: "Stephen.Shi" Date: Wed, 4 Aug 2021 14:56:47 +0800 Subject: [PATCH 08/17] Update README.md fixed a typo of a company name. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 340478e9..494b3f58 100644 --- a/README.md +++ b/README.md @@ -443,7 +443,7 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅 - 319、深圳市姜科网络有限公司 - 320、青岛日日顺物流有限公司 - 321、南京太川信息技术有限公司 - - 322、美图之家科技优先公司【美图】 + - 322、美图之家科技有限公司【美图】 - 323、南京太川信息技术有限公司 - 324、众薪科技(北京)有限公司 - 325、武汉安安物联科技有限公司 From 725335f4ba8b0470dea37e5b3b763a6b0136bb20 Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Wed, 18 Aug 2021 20:39:21 +0800 Subject: [PATCH 09/17] upgrade doc --- README.md | 42 ++++++++++++++++++++++++++++++++++++ doc/XXL-JOB官方文档.md | 44 +++++++++++++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 340478e9..1cd8a915 100644 --- a/README.md +++ b/README.md @@ -568,6 +568,48 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅 - 444、上海金仕达软件科技有限公司 - 445、深圳易世通达科技有限公司 - 446、爱动超越人工智能科技(北京)有限责任公司 + - 447、迪普信(北京)科技有限公司 + - 448、掌站科技(北京)有限公司 + - 449、深圳市华云中盛股份有限公司 + - 450、上海原圈科技有限公司 + - 451、广州赞赏信息科技有限公司 + - 452、Amber Group + - 453、德威国际货运代理(上海)公司 + - 454、浙江杰夫兄弟智慧科技有限公司 + - 455、信也科技 + - 456、开思时代科技(深圳)有限公司 + - 457、大连槐德科技有限公司 + - 458、同程生活 + - 459、松果出行 + - 460、企鹅杏仁集团 + - 461、宁波科云信息科技有限公司 + - 462、上海格蓝威驰信息科技有限公司 + - 463、杭州趣淘鲸科技有限公司 + - 464、湖州市数字惠民科技有限公司 + - 465、乐普(北京)医疗器械股份有限公司 + - 466、广州市晴川高新技术开发有限公司 + - 467、山西缇客科技有限公司 + - 468、徐州卡西穆电子商务有限公司 + - 469、格创东智科技有限公司 + - 470、世纪龙信息网络有限责任公司 + - 471、邦道科技有限公司 + - 472、河南中盟新云科技股份有限公司 + - 473、横琴人寿保险有限公司 + - 474、上海海隆华钟信息技术有限公司 + - 475、上海久湛 + - 476、上海仙豆智能机器人有限公司 + - 477、广州汇尚网络科技有限公司 + - 478、深圳市阿卡索资讯股份有限公司 + - 479、青岛佳家康健康管理有限责任公司 + - 480、蓝城兄弟 + - 481、成都天府通金融服务股份有限公司 + - 482、深圳云镖网络科技有限公司 + - 483、上海影创科技 + - 484、成都艾拉物联 + - 485、北京客邻尚品网络技术有限公司 + - 486、IT实战联盟 + - 487、杭州尤拉夫科技有限公司 + - 488、中大检测(湖南)股份有限公司 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index a5776672..aba149b6 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -538,7 +538,49 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅 - 444、上海金仕达软件科技有限公司 - 445、深圳易世通达科技有限公司 - 446、爱动超越人工智能科技(北京)有限责任公司 - - …… + - 447、迪普信(北京)科技有限公司 + - 448、掌站科技(北京)有限公司 + - 449、深圳市华云中盛股份有限公司 + - 450、上海原圈科技有限公司 + - 451、广州赞赏信息科技有限公司 + - 452、Amber Group + - 453、德威国际货运代理(上海)公司 + - 454、浙江杰夫兄弟智慧科技有限公司 + - 455、信也科技 + - 456、开思时代科技(深圳)有限公司 + - 457、大连槐德科技有限公司 + - 458、同程生活 + - 459、松果出行 + - 460、企鹅杏仁集团 + - 461、宁波科云信息科技有限公司 + - 462、上海格蓝威驰信息科技有限公司 + - 463、杭州趣淘鲸科技有限公司 + - 464、湖州市数字惠民科技有限公司 + - 465、乐普(北京)医疗器械股份有限公司 + - 466、广州市晴川高新技术开发有限公司 + - 467、山西缇客科技有限公司 + - 468、徐州卡西穆电子商务有限公司 + - 469、格创东智科技有限公司 + - 470、世纪龙信息网络有限责任公司 + - 471、邦道科技有限公司 + - 472、河南中盟新云科技股份有限公司 + - 473、横琴人寿保险有限公司 + - 474、上海海隆华钟信息技术有限公司 + - 475、上海久湛 + - 476、上海仙豆智能机器人有限公司 + - 477、广州汇尚网络科技有限公司 + - 478、深圳市阿卡索资讯股份有限公司 + - 479、青岛佳家康健康管理有限责任公司 + - 480、蓝城兄弟 + - 481、成都天府通金融服务股份有限公司 + - 482、深圳云镖网络科技有限公司 + - 483、上海影创科技 + - 484、成都艾拉物联 + - 485、北京客邻尚品网络技术有限公司 + - 486、IT实战联盟 + - 487、杭州尤拉夫科技有限公司 + - 488、中大检测(湖南)股份有限公司 + - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 From f7fa721690cd61b030ab8fedc4c8c2a634b72cea Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Wed, 18 Aug 2021 21:07:11 +0800 Subject: [PATCH 10/17] code optimize --- .../admin/core/alarm/impl/EmailJobAlarm.java | 1 + .../xxl/job/core/executor/XxlJobExecutor.java | 105 ++++++++++-------- .../executor/impl/XxlJobSimpleExecutor.java | 5 +- .../executor/impl/XxlJobSpringExecutor.java | 5 +- .../core/thread/ExecutorRegistryThread.java | 2 +- .../core/thread/JobLogFileCleanThread.java | 2 +- .../core/thread/TriggerCallbackThread.java | 4 +- .../xxl/job/core/util/XxlJobRemotingUtil.java | 4 + .../frameless/FramelessApplication.java | 4 +- .../config/FrameLessXxlJobConfig.java | 4 +- .../frameless/jobhandler/SampleXxlJob.java | 2 +- .../service/jobhandler/SampleXxlJob.java | 20 ---- 12 files changed, 78 insertions(+), 80 deletions(-) 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 e7290d76..16e52184 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 @@ -32,6 +32,7 @@ public class EmailJobAlarm implements JobAlarm { * * @param jobLog */ + @Override public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog){ boolean alarmResult = true; diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java index 4fa2eea6..70a2dad9 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java @@ -84,10 +84,10 @@ public class XxlJobExecutor { initEmbedServer(address, ip, port, appname, accessToken); } public void destroy(){ - // destory executor-server + // destroy executor-server stopEmbedServer(); - // destory jobThreadRepository + // destroy jobThreadRepository if (jobThreadRepository.size() > 0) { for (Map.Entry item: jobThreadRepository.entrySet()) { JobThread oldJobThread = removeJobThread(item.getKey(), "web container destroy and kill the job."); @@ -105,58 +105,14 @@ public class XxlJobExecutor { jobHandlerRepository.clear(); - // destory JobLogFileCleanThread + // destroy JobLogFileCleanThread JobLogFileCleanThread.getInstance().toStop(); - // destory TriggerCallbackThread + // destroy TriggerCallbackThread TriggerCallbackThread.getInstance().toStop(); } - protected void registerJobHandler(XxlJob xxlJob, Object bean, Method executeMethod){ - if (xxlJob == null) { - return; - } - - String name = xxlJob.value(); - //make and simplify the variables since they'll be called several times later - Class clazz = bean.getClass(); - String methodName = executeMethod.getName(); - if (name.trim().length() == 0) { - throw new RuntimeException("xxl-job method-jobhandler name invalid, for[" + clazz + "#" + methodName + "] ."); - } - if (loadJobHandler(name) != null) { - throw new RuntimeException("xxl-job jobhandler[" + name + "] naming conflicts."); - } - - executeMethod.setAccessible(true); - - // init and destroy - Method initMethod = null; - Method destroyMethod = null; - - if (xxlJob.init().trim().length() > 0) { - try { - initMethod = clazz.getDeclaredMethod(xxlJob.init()); - initMethod.setAccessible(true); - } catch (NoSuchMethodException e) { - throw new RuntimeException("xxl-job method-jobhandler initMethod invalid, for[" + clazz + "#" + methodName + "] ."); - } - } - if (xxlJob.destroy().trim().length() > 0) { - try { - destroyMethod = clazz.getDeclaredMethod(xxlJob.destroy()); - destroyMethod.setAccessible(true); - } catch (NoSuchMethodException e) { - throw new RuntimeException("xxl-job method-jobhandler destroyMethod invalid, for[" + clazz + "#" + methodName + "] ."); - } - } - - // registry jobhandler - registJobHandler(name, new MethodJobHandler(bean, executeMethod, initMethod, destroyMethod)); - - } - // ---------------------- admin-client (rpc invoker) ---------------------- private static List adminBizList; @@ -225,6 +181,59 @@ public class XxlJobExecutor { logger.info(">>>>>>>>>>> xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler); return jobHandlerRepository.put(name, jobHandler); } + protected void registJobHandler(XxlJob xxlJob, Object bean, Method executeMethod){ + if (xxlJob == null) { + return; + } + + String name = xxlJob.value(); + //make and simplify the variables since they'll be called several times later + Class clazz = bean.getClass(); + String methodName = executeMethod.getName(); + if (name.trim().length() == 0) { + throw new RuntimeException("xxl-job method-jobhandler name invalid, for[" + clazz + "#" + methodName + "] ."); + } + if (loadJobHandler(name) != null) { + throw new RuntimeException("xxl-job jobhandler[" + name + "] naming conflicts."); + } + + // execute method + /*if (!(method.getParameterTypes().length == 1 && method.getParameterTypes()[0].isAssignableFrom(String.class))) { + throw new RuntimeException("xxl-job method-jobhandler param-classtype invalid, for[" + bean.getClass() + "#" + method.getName() + "] , " + + "The correct method format like \" public ReturnT execute(String param) \" ."); + } + if (!method.getReturnType().isAssignableFrom(ReturnT.class)) { + throw new RuntimeException("xxl-job method-jobhandler return-classtype invalid, for[" + bean.getClass() + "#" + method.getName() + "] , " + + "The correct method format like \" public ReturnT execute(String param) \" ."); + }*/ + + executeMethod.setAccessible(true); + + // init and destroy + Method initMethod = null; + Method destroyMethod = null; + + if (xxlJob.init().trim().length() > 0) { + try { + initMethod = clazz.getDeclaredMethod(xxlJob.init()); + initMethod.setAccessible(true); + } catch (NoSuchMethodException e) { + throw new RuntimeException("xxl-job method-jobhandler initMethod invalid, for[" + clazz + "#" + methodName + "] ."); + } + } + if (xxlJob.destroy().trim().length() > 0) { + try { + destroyMethod = clazz.getDeclaredMethod(xxlJob.destroy()); + destroyMethod.setAccessible(true); + } catch (NoSuchMethodException e) { + throw new RuntimeException("xxl-job method-jobhandler destroyMethod invalid, for[" + clazz + "#" + methodName + "] ."); + } + } + + // registry jobhandler + registJobHandler(name, new MethodJobHandler(bean, executeMethod, initMethod, destroyMethod)); + + } // ---------------------- job thread repository ---------------------- diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java index b262f4a5..53efbb95 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java @@ -30,6 +30,7 @@ public class XxlJobSimpleExecutor extends XxlJobExecutor { } + @Override public void start() { // init JobHandler Repository (for method) @@ -43,6 +44,7 @@ public class XxlJobSimpleExecutor extends XxlJobExecutor { } } + @Override public void destroy() { super.destroy(); } @@ -62,7 +64,8 @@ public class XxlJobSimpleExecutor extends XxlJobExecutor { } for (Method executeMethod : methods) { XxlJob xxlJob = executeMethod.getAnnotation(XxlJob.class); - registerJobHandler(xxlJob, bean, executeMethod); + // registry + registJobHandler(xxlJob, bean, executeMethod); } } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java index 2a6829ec..3c2a67d5 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java @@ -105,7 +105,8 @@ public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationC for (Map.Entry methodXxlJobEntry : annotatedMethods.entrySet()) { Method executeMethod = methodXxlJobEntry.getKey(); XxlJob xxlJob = methodXxlJobEntry.getValue(); - registerJobHandler(xxlJob, bean, executeMethod); + // regist + registJobHandler(xxlJob, bean, executeMethod); } } } @@ -115,7 +116,7 @@ public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationC @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; + XxlJobSpringExecutor.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java index ff657b21..e43a2a49 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java @@ -102,7 +102,7 @@ public class ExecutorRegistryThread { logger.error(e.getMessage(), e); } } - logger.info(">>>>>>>>>>> xxl-job, executor registry thread destory."); + logger.info(">>>>>>>>>>> xxl-job, executor registry thread destroy."); } }); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobLogFileCleanThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobLogFileCleanThread.java index 8b983715..b5691542 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobLogFileCleanThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobLogFileCleanThread.java @@ -96,7 +96,7 @@ public class JobLogFileCleanThread { } } } - logger.info(">>>>>>>>>>> xxl-job, executor JobLogFileCleanThread thread destory."); + logger.info(">>>>>>>>>>> xxl-job, executor JobLogFileCleanThread thread destroy."); } }); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java index 93eda40b..40acac00 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java @@ -95,7 +95,7 @@ public class TriggerCallbackThread { logger.error(e.getMessage(), e); } } - logger.info(">>>>>>>>>>> xxl-job, executor callback thread destory."); + logger.info(">>>>>>>>>>> xxl-job, executor callback thread destroy."); } }); @@ -125,7 +125,7 @@ public class TriggerCallbackThread { } } } - logger.info(">>>>>>>>>>> xxl-job, executor retry callback thread destory."); + logger.info(">>>>>>>>>>> xxl-job, executor retry callback thread destroy."); } }); triggerRetryCallbackThread.setDaemon(true); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java index 8d781c31..eac2dd00 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java @@ -34,17 +34,21 @@ public class XxlJobRemotingUtil { logger.error(e.getMessage(), e); } connection.setHostnameVerifier(new HostnameVerifier() { + @Override public boolean verify(String hostname, SSLSession session) { return true; } }); } private static final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { + @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[]{}; } + @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } + @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } }}; diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/FramelessApplication.java b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/FramelessApplication.java index e259b8f5..1e7cb7dd 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/FramelessApplication.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/FramelessApplication.java @@ -29,8 +29,8 @@ public class FramelessApplication { } catch (Exception e) { logger.error(e.getMessage(), e); } finally { - // destory - FrameLessXxlJobConfig.getInstance().destoryXxlJobExecutor(); + // destroy + FrameLessXxlJobConfig.getInstance().destroyXxlJobExecutor(); } } 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 eb916ad2..1d882dc5 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 @@ -56,9 +56,9 @@ public class FrameLessXxlJobConfig { } /** - * destory + * destroy */ - public void destoryXxlJobExecutor() { + public void destroyXxlJobExecutor() { if (xxlJobExecutor != null) { xxlJobExecutor.destroy(); } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/jobhandler/SampleXxlJob.java b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/jobhandler/SampleXxlJob.java index d3d955a7..a4eefd14 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/jobhandler/SampleXxlJob.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/jobhandler/SampleXxlJob.java @@ -244,7 +244,7 @@ public class SampleXxlJob { logger.info("init"); } public void destroy(){ - logger.info("destory"); + logger.info("destroy"); } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java index 404416db..759d6625 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java @@ -245,29 +245,9 @@ public class SampleXxlJob { public void init(){ logger.info("init"); } - public void destroy(){ logger.info("destroy"); } - /** - * 6、生命周期任务示例:任务初始化与销毁时,支持private方法(但不推荐); - */ - @XxlJob(value = "demoJobHandler3", init = "initForDemoJobHandler3", destroy = "destroyForDemoJobHandler3") - public void demoJobHandler3() throws Exception { - XxlJobHelper.log("XXL-JOB, Hello World."); - } - - private void initForDemoJobHandler3(){ - logger.info("initForDemoJobHandler3"); - } - - /** - * 演示private方法也可以被访问且执行 - */ - public void destroyForDemoJobHandler3(){ - logger.info("destroyForDemoJobHandler3"); - } - } From 43de0dab6529acfd851cf5a57babfb78cc64a4e2 Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Wed, 18 Aug 2021 21:11:10 +0800 Subject: [PATCH 11/17] code optimize --- doc/XXL-JOB官方文档.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index aba149b6..0f54141e 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2185,6 +2185,7 @@ public void execute() { - 重试任务:失败时,新增主任务。所有调度记录,包括入口调度和重试调度,均挂载主任务上。 - 2、【优化】[规划中]分片任务:全部完成后才会出发后置节点; - 3、【优化】多个项目依赖升级至较新稳定版本,如netty、groovy、spring、springboot等; +- 3、【优化】合并多项PR:代码结构、代码变量和注释等多项优化调整; ### 7.33 版本 v2.4.0 Release Notes[规划中] - 1、[规划中]DAG流程任务 From 135abc3719e15280cd87fd369f40f4ee2462b092 Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Wed, 18 Aug 2021 21:19:45 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E3=80=90=E4=BF=AE=E5=A4=8D=E3=80=91?= =?UTF-8?q?=E9=82=AE=E7=AE=B1=E6=A0=A1=E9=AA=8C=E9=80=BB=E8=BE=91=E4=B8=8B?= =?UTF-8?q?=E6=94=BE=E8=87=B3EmailJobAlarm=E4=B8=AD=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=AF=B9=E5=85=B6=E4=BB=96=E5=91=8A=E8=AD=A6=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E7=9A=84=E5=B9=B2=E6=89=B0=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 0f54141e..162db67e 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2186,6 +2186,7 @@ public void execute() { - 2、【优化】[规划中]分片任务:全部完成后才会出发后置节点; - 3、【优化】多个项目依赖升级至较新稳定版本,如netty、groovy、spring、springboot等; - 3、【优化】合并多项PR:代码结构、代码变量和注释等多项优化调整; +- 4、【修复】邮箱校验逻辑下放至EmailJobAlarm中,避免对其他告警方式的干扰; ### 7.33 版本 v2.4.0 Release Notes[规划中] - 1、[规划中]DAG流程任务 From 9fe7aaa12e69ddb3cf99ee5681adbc32aa65ad54 Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Wed, 18 Aug 2021 21:45:34 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E5=90=8D=E4=BC=98=E5=8C=96(ISSUE-2527)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 5 +++-- .../main/java/com/xxl/job/core/server/EmbedServer.java | 2 +- .../src/main/java/com/xxl/job/core/thread/JobThread.java | 3 +++ .../src/main/java/com/xxl/job/core/util/NetUtil.java | 2 +- .../java/com/xxl/job/core/util/XxlJobRemotingUtil.java | 8 ++++---- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 162db67e..7077d996 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2185,8 +2185,9 @@ public void execute() { - 重试任务:失败时,新增主任务。所有调度记录,包括入口调度和重试调度,均挂载主任务上。 - 2、【优化】[规划中]分片任务:全部完成后才会出发后置节点; - 3、【优化】多个项目依赖升级至较新稳定版本,如netty、groovy、spring、springboot等; -- 3、【优化】合并多项PR:代码结构、代码变量和注释等多项优化调整; -- 4、【修复】邮箱校验逻辑下放至EmailJobAlarm中,避免对其他告警方式的干扰; +- 4、【优化】合并多项PR:代码结构、代码变量和注释等多项优化调整; +- 5、【优化】任务线程名优化(ISSUE-2527) +- 6、【修复】邮箱校验逻辑下放至EmailJobAlarm中,避免对其他告警方式的干扰; ### 7.33 版本 v2.4.0 Release Notes[规划中] - 1、[规划中]DAG流程任务 diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/server/EmbedServer.java b/xxl-job-core/src/main/java/com/xxl/job/core/server/EmbedServer.java index a3fc9af9..242d6b63 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/server/EmbedServer.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/server/EmbedServer.java @@ -52,7 +52,7 @@ public class EmbedServer { new ThreadFactory() { @Override public Thread newThread(Runnable r) { - return new Thread(r, "xxl-rpc, EmbedServer bizThreadPool-" + r.hashCode()); + return new Thread(r, "xxl-job, EmbedServer bizThreadPool-" + r.hashCode()); } }, new RejectedExecutionHandler() { 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 5c7553c1..cf07a55a 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 @@ -44,6 +44,9 @@ public class JobThread extends Thread{ this.handler = handler; this.triggerQueue = new LinkedBlockingQueue(); this.triggerLogIdSet = Collections.synchronizedSet(new HashSet()); + + // assign job thread name + this.setName("xxl-job, JobThread-"+jobId+"-"+System.currentTimeMillis()); } public IJobHandler getHandler() { return handler; diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java index 31270df1..41d285f1 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java @@ -53,7 +53,7 @@ public class NetUtil { serverSocket = new ServerSocket(port); used = false; } catch (IOException e) { - logger.info(">>>>>>>>>>> xxl-rpc, port[{}] is in use.", port); + logger.info(">>>>>>>>>>> xxl-job, port[{}] is in use.", port); used = true; } finally { if (serverSocket != null) { diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java index eac2dd00..d22a73e7 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java @@ -118,7 +118,7 @@ public class XxlJobRemotingUtil { // valid StatusCode int statusCode = connection.getResponseCode(); if (statusCode != 200) { - return new ReturnT(ReturnT.FAIL_CODE, "xxl-rpc remoting fail, StatusCode("+ statusCode +") invalid. for url : " + url); + return new ReturnT(ReturnT.FAIL_CODE, "xxl-job remoting fail, StatusCode("+ statusCode +") invalid. for url : " + url); } // result @@ -135,13 +135,13 @@ public class XxlJobRemotingUtil { ReturnT returnT = GsonTool.fromJson(resultJson, ReturnT.class, returnTargClassOfT); return returnT; } catch (Exception e) { - logger.error("xxl-rpc remoting (url="+url+") response content invalid("+ resultJson +").", e); - return new ReturnT(ReturnT.FAIL_CODE, "xxl-rpc remoting (url="+url+") response content invalid("+ resultJson +")."); + logger.error("xxl-job remoting (url="+url+") response content invalid("+ resultJson +").", e); + return new ReturnT(ReturnT.FAIL_CODE, "xxl-job remoting (url="+url+") response content invalid("+ resultJson +")."); } } catch (Exception e) { logger.error(e.getMessage(), e); - return new ReturnT(ReturnT.FAIL_CODE, "xxl-rpc remoting error("+ e.getMessage() +"), for url : " + url); + return new ReturnT(ReturnT.FAIL_CODE, "xxl-job remoting error("+ e.getMessage() +"), for url : " + url); } finally { try { if (bufferedReader != null) { From 3604b354837083100245f69ba7e1fc53af86fc2c Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Fri, 10 Dec 2021 21:02:56 +0800 Subject: [PATCH 14/17] upgrade doc --- README.md | 31 ++++++++++++++++++++++++++++++- doc/XXL-JOB官方文档.md | 31 ++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6502f6b3..50c1067a 100644 --- a/README.md +++ b/README.md @@ -610,6 +610,35 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅 - 486、IT实战联盟 - 487、杭州尤拉夫科技有限公司 - 488、中大检测(湖南)股份有限公司 + - 489、江苏电老虎工业互联网股份有限公司 + - 490、上海助通信息科技有限公司 + - 491、北京符节科技有限公司 + - 492、杭州英祐科技有限公司 + - 493、江苏电老虎工业互联网股份有限公司 + - 494、深圳市点猫科技有限公司 + - 495、杭州天音 + - 496、深圳市二十一科技互联网有限公司 + - 497、海南海口翎度科技 + - 498、北京小趣智品科技有限公司 + - 499、广州石竹计算机软件有限公司 + - 500、深圳市惟客数据科技有限公司 + - 501、中国医疗器械有限公司 + - 502、上海云谦科技有限公司 + - 503、上海磐农信息科技有限公司 + - 504、广州领航食品有限公司 + - 505、青岛掌讯通区块链科技有限公司 + - 506、北京新网数码信息技术有限公司 + - 507、超体信息科技(深圳)有限公司 + - 508、长沙店帮手信息科技有限公司 + - 509、上海助弓装饰工程有限公司 + - 510、杭州寻联网络科技有限公司 + - 511、成都大淘客科技有限公司 + - 512、松果出行 + - 513、深圳市唤梦科技有限公司 + - 514、上汽集团商用车技术中心 + - 515、北京中航讯科技股份有限公司 + - 516、北龙中网(北京)科技有限责任公司 + - 517、前海超级前台(深圳)信息技术有限公司 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 @@ -629,7 +658,7 @@ This product is open source and free, and will continue to provide free communit - Licensed under the GNU General Public License (GPL) v3. - Copyright (c) 2015-present, xuxueli. -产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。 +产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。如有需要可邮件联系作者免费获取项目授权。 ## Donate diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 7077d996..621c467f 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -580,6 +580,35 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅 - 486、IT实战联盟 - 487、杭州尤拉夫科技有限公司 - 488、中大检测(湖南)股份有限公司 + - 489、江苏电老虎工业互联网股份有限公司 + - 490、上海助通信息科技有限公司 + - 491、北京符节科技有限公司 + - 492、杭州英祐科技有限公司 + - 493、江苏电老虎工业互联网股份有限公司 + - 494、深圳市点猫科技有限公司 + - 495、杭州天音 + - 496、深圳市二十一科技互联网有限公司 + - 497、海南海口翎度科技 + - 498、北京小趣智品科技有限公司 + - 499、广州石竹计算机软件有限公司 + - 500、深圳市惟客数据科技有限公司 + - 501、中国医疗器械有限公司 + - 502、上海云谦科技有限公司 + - 503、上海磐农信息科技有限公司 + - 504、广州领航食品有限公司 + - 505、青岛掌讯通区块链科技有限公司 + - 506、北京新网数码信息技术有限公司 + - 507、超体信息科技(深圳)有限公司 + - 508、长沙店帮手信息科技有限公司 + - 509、上海助弓装饰工程有限公司 + - 510、杭州寻联网络科技有限公司 + - 511、成都大淘客科技有限公司 + - 512、松果出行 + - 513、深圳市唤梦科技有限公司 + - 514、上汽集团商用车技术中心 + - 515、北京中航讯科技股份有限公司 + - 516、北龙中网(北京)科技有限责任公司 + - 517、前海超级前台(深圳)信息技术有限公司 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 @@ -2240,7 +2269,7 @@ public void execute() { 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 ### 8.3 开源协议和版权 -产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。 +产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。如有需要可邮件联系作者免费获取项目授权。 - Licensed under the GNU General Public License (GPL) v3. - Copyright (c) 2015-present, xuxueli. From 00535b652466df96df947710024744fc49ed1c9d Mon Sep 17 00:00:00 2001 From: sikadai Date: Sun, 8 May 2022 22:13:29 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=86=E7=89=87?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E5=A4=9A=E7=BA=BF=E7=A8=8B=E7=9A=84=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xxl/job/admin/core/model/XxlJobInfo.java | 10 +++- .../core/route/ExecutorRouteStrategyEnum.java | 2 +- .../route/strategy/ExecutorRouteSharding.java | 23 ++++++++ .../job/admin/core/trigger/XxlJobTrigger.java | 53 ++++++++++++++----- .../admin/service/impl/XxlJobServiceImpl.java | 1 + .../src/main/resources/application.properties | 2 +- .../main/resources/i18n/message_en.properties | 2 + .../resources/i18n/message_zh_CN.properties | 2 + .../resources/i18n/message_zh_TC.properties | 2 + .../mybatis-mapper/XxlJobInfoMapper.xml | 5 ++ .../resources/static/js/jobinfo.index.1.js | 5 ++ .../templates/jobinfo/jobinfo.index.ftl | 18 +++++++ .../xxl/job/core/biz/model/TriggerParam.java | 9 ++++ .../xxl/job/core/context/XxlJobContext.java | 19 +++++++ .../xxl/job/core/context/XxlJobHelper.java | 14 +++++ .../core/enums/ExecutorBlockStrategyEnum.java | 2 +- .../com/xxl/job/core/thread/JobThread.java | 21 +++++++- .../core/thread/TriggerCallbackThread.java | 1 + .../service/jobhandler/SampleXxlJob.java | 9 +++- 19 files changed, 178 insertions(+), 22 deletions(-) create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteSharding.java diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java index e47b6dc6..8be56ad0 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java @@ -27,6 +27,7 @@ public class XxlJobInfo { private String executorRouteStrategy; // 执行器路由策略 private String executorHandler; // 执行器,任务Handler名称 private String executorParam; // 执行器,任务参数 + private String shardingParam; // 执行器,分片参数 private String executorBlockStrategy; // 阻塞处理策略 private int executorTimeout; // 任务执行超时时间,单位秒 private int executorFailRetryCount; // 失败重试次数 @@ -42,7 +43,6 @@ public class XxlJobInfo { private long triggerLastTime; // 上次调度时间 private long triggerNextTime; // 下次调度时间 - public int getId() { return id; } @@ -147,6 +147,14 @@ public class XxlJobInfo { this.executorParam = executorParam; } + public String getShardingParam() { + return shardingParam; + } + + public void setShardingParam(String shardingParam) { + this.shardingParam = shardingParam; + } + public String getExecutorBlockStrategy() { return executorBlockStrategy; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java index 7fff93a9..f101d65c 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java @@ -17,7 +17,7 @@ public enum ExecutorRouteStrategyEnum { LEAST_RECENTLY_USED(I18nUtil.getString("jobconf_route_lru"), new ExecutorRouteLRU()), FAILOVER(I18nUtil.getString("jobconf_route_failover"), new ExecutorRouteFailover()), BUSYOVER(I18nUtil.getString("jobconf_route_busyover"), new ExecutorRouteBusyover()), - SHARDING_BROADCAST(I18nUtil.getString("jobconf_route_shard"), null); + SHARDING_BROADCAST(I18nUtil.getString("jobconf_route_shard"), new ExecutorRouteSharding()); ExecutorRouteStrategyEnum(String title, ExecutorRouter router) { this.title = title; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteSharding.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteSharding.java new file mode 100644 index 00000000..6becbfc6 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteSharding.java @@ -0,0 +1,23 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.biz.model.TriggerParam; + +import java.util.List; + +/** + *

+ * 分片规则的-路由器-直接采取的是随机路由算法 + *

+ * + * @author daiqi + * @since 2022/5/8 18:23 + */ +public class ExecutorRouteSharding extends ExecutorRouteBusyover { + + @Override + public ReturnT route(TriggerParam triggerParam, List addressList) { + return super.route(triggerParam, addressList); + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index 748befc6..65aedd66 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -13,10 +13,12 @@ import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.util.IpUtil; import com.xxl.job.core.util.ThrowableUtil; +import io.netty.util.internal.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; +import java.util.List; /** * xxl-job trigger @@ -79,8 +81,9 @@ public class XxlJobTrigger { if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) && group.getRegistryList()!=null && !group.getRegistryList().isEmpty() && shardingParam==null) { - for (int i = 0; i < group.getRegistryList().size(); i++) { - processTrigger(group, jobInfo, finalFailRetryCount, triggerType, i, group.getRegistryList().size()); + int shardingTotal = getSharingTotal(jobInfo.getShardingParam()); + for (int i = 0; i < shardingTotal; i++) { + processTrigger(group, jobInfo, finalFailRetryCount, triggerType, i, shardingTotal); } } else { if (shardingParam == null) { @@ -91,6 +94,35 @@ public class XxlJobTrigger { } + private static int getSharingTotal(String executorShardingParam) { + if (StringUtil.isNullOrEmpty(executorShardingParam)) { + return 1; + } + // 获取分片的数量 + return getShardingArr(executorShardingParam).length; + } + + public static String getShardingParam(String shardingParams, int index) { + String[] shardingArr = getShardingArr(shardingParams); + String[] shardingParamArr = shardingArr[index].split("="); + if (shardingParamArr.length >= 2) { + return shardingParamArr[1]; + } + return shardingParamArr[0]; + } + + private static String [] getShardingArr(String shardingParams) { + if (StringUtil.isNullOrEmpty(shardingParams)) { + return new String[0]; + } + return shardingParams.split("/"); + } + + public static class ShardingInfo { + private int total; + private List shardingParams; + } + private static boolean isNumeric(String str){ try { int result = Integer.valueOf(str); @@ -113,7 +145,7 @@ public class XxlJobTrigger { // param ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION); // block strategy ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null); // route strategy - String shardingParam = (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==executorRouteStrategyEnum)?String.valueOf(index).concat("/").concat(String.valueOf(total)):null; + String shardingParam = (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==executorRouteStrategyEnum)?getShardingParam(jobInfo.getShardingParam(), index):null; // 1、save log-id XxlJobLog jobLog = new XxlJobLog(); @@ -128,6 +160,7 @@ public class XxlJobTrigger { triggerParam.setJobId(jobInfo.getId()); triggerParam.setExecutorHandler(jobInfo.getExecutorHandler()); triggerParam.setExecutorParams(jobInfo.getExecutorParam()); + triggerParam.setShardingParam(shardingParam); triggerParam.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); triggerParam.setExecutorTimeout(jobInfo.getExecutorTimeout()); triggerParam.setLogId(jobLog.getId()); @@ -142,17 +175,9 @@ public class XxlJobTrigger { String address = null; ReturnT routeAddressResult = null; if (group.getRegistryList()!=null && !group.getRegistryList().isEmpty()) { - if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum) { - if (index < group.getRegistryList().size()) { - address = group.getRegistryList().get(index); - } else { - address = group.getRegistryList().get(0); - } - } else { - routeAddressResult = executorRouteStrategyEnum.getRouter().route(triggerParam, group.getRegistryList()); - if (routeAddressResult.getCode() == ReturnT.SUCCESS_CODE) { - address = routeAddressResult.getContent(); - } + routeAddressResult = executorRouteStrategyEnum.getRouter().route(triggerParam, group.getRegistryList()); + if (routeAddressResult.getCode() == ReturnT.SUCCESS_CODE) { + address = routeAddressResult.getContent(); } } else { routeAddressResult = new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("jobconf_trigger_address_empty")); 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..f7d1fb0a 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 @@ -274,6 +274,7 @@ public class XxlJobServiceImpl implements XxlJobService { exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy()); exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler()); exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam()); + exists_jobInfo.setShardingParam(jobInfo.getShardingParam()); exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout()); exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount()); diff --git a/xxl-job-admin/src/main/resources/application.properties b/xxl-job-admin/src/main/resources/application.properties index afe93b42..1789e6c8 100644 --- a/xxl-job-admin/src/main/resources/application.properties +++ b/xxl-job-admin/src/main/resources/application.properties @@ -25,7 +25,7 @@ mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml ### xxl-job, datasource spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root -spring.datasource.password=root_pwd +spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ### datasource-pool 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 7d67636d..1408355a 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -117,6 +117,7 @@ jobinfo_field_jobdesc=Job description jobinfo_field_timeout=Job timeout period jobinfo_field_gluetype=GLUE Type jobinfo_field_executorparam=Param +jobinfo_field_shardingparam=Sharding Param jobinfo_field_author=Author jobinfo_field_alarmemail=Alarm email jobinfo_field_alarmemail_placeholder=Please enter alarm mail, if there are more than one comma separated @@ -221,6 +222,7 @@ jobgroup_empty=There is no valid executor. Please contact the administrator ## job conf jobconf_block_SERIAL_EXECUTION=Serial execution +jobconf_block_CONCURRENT_EXECUTION=Concurrent execution jobconf_block_DISCARD_LATER=Discard Later jobconf_block_COVER_EARLY=Cover Early jobconf_route_first=First 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 4897a238..e8edbdcc 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 @@ -116,6 +116,7 @@ jobinfo_field_jobgroup=执行器 jobinfo_field_jobdesc=任务描述 jobinfo_field_gluetype=运行模式 jobinfo_field_executorparam=任务参数 +jobinfo_field_shardingparam=任务分片参数 jobinfo_field_author=负责人 jobinfo_field_timeout=任务超时时间 jobinfo_field_alarmemail=报警邮件 @@ -221,6 +222,7 @@ jobgroup_empty=不存在有效执行器,请联系管理员 ## job conf jobconf_block_SERIAL_EXECUTION=单机串行 +jobconf_block_CONCURRENT_EXECUTION=单机并行 jobconf_block_DISCARD_LATER=丢弃后续调度 jobconf_block_COVER_EARLY=覆盖之前调度 jobconf_route_first=第一个 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 57d28e4f..f98eb649 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 @@ -116,6 +116,7 @@ jobinfo_field_jobgroup=執行器 jobinfo_field_jobdesc=任務描述 jobinfo_field_gluetype=運行模式 jobinfo_field_executorparam=任務參數 +jobinfo_field_shardingparam=分片參數 jobinfo_field_author=負責人 jobinfo_field_timeout=任務超時秒數 jobinfo_field_alarmemail=告警郵件 @@ -221,6 +222,7 @@ jobgroup_empty=不存在有效執行器,請聯絡系統管理員 ## job conf jobconf_block_SERIAL_EXECUTION=單機串行 +jobconf_block_CONCURRENT_EXECUTION=单机并行 jobconf_block_DISCARD_LATER=丢棄后續調度 jobconf_block_COVER_EARLY=覆蓋之前調度 jobconf_route_first=第一個 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..6968d250 100644 --- a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml +++ b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml @@ -22,6 +22,7 @@ + @@ -52,6 +53,7 @@ t.executor_route_strategy, t.executor_handler, t.executor_param, + t.sharding_param, t.executor_block_strategy, t.executor_timeout, t.executor_fail_retry_count, @@ -125,6 +127,7 @@ executor_route_strategy, executor_handler, executor_param, + sharding_param, executor_block_strategy, executor_timeout, executor_fail_retry_count, @@ -149,6 +152,7 @@ #{executorRouteStrategy}, #{executorHandler}, #{executorParam}, + #{shardingParam}, #{executorBlockStrategy}, #{executorTimeout}, #{executorFailRetryCount}, @@ -187,6 +191,7 @@ executor_route_strategy = #{executorRouteStrategy}, executor_handler = #{executorHandler}, executor_param = #{executorParam}, + sharding_param = #{shardingParam}, executor_block_strategy = #{executorBlockStrategy}, executor_timeout = ${executorTimeout}, executor_fail_retry_count = ${executorFailRetryCount}, diff --git a/xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js b/xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js index b479e972..8a472ec6 100644 --- a/xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js +++ b/xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js @@ -74,6 +74,7 @@ $(function() { } }, { "data": 'executorParam', "visible" : false}, + { "data": 'shardingParam', "visible" : false}, { "data": 'addTime', "visible" : false, @@ -266,6 +267,7 @@ $(function() { $("#jobTriggerModal .form input[name='id']").val( row.id ); $("#jobTriggerModal .form textarea[name='executorParam']").val( row.executorParam ); + $("#jobTriggerModal .form textarea[name='shardingParam']").val( row.shardingParam ); $('#jobTriggerModal').modal({backdrop: false, keyboard: false}).modal('show'); }); @@ -276,6 +278,7 @@ $(function() { data : { "id" : $("#jobTriggerModal .form input[name='id']").val(), "executorParam" : $("#jobTriggerModal .textarea[name='executorParam']").val(), + "shardingParam" : $("#jobTriggerModal .textarea[name='shardingParam']").val(), "addressList" : $("#jobTriggerModal .textarea[name='addressList']").val() }, dataType : "json", @@ -561,6 +564,7 @@ $(function() { $('#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 ); + $("#updateModal .form textarea[name='shardingParam']").val( row.shardingParam ); // 》init glueType $("#updateModal .form select[name=glueType]").change(); @@ -716,6 +720,7 @@ $(function() { $('#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 ); + $("#addModal .form textarea[name='shardingParam']").val( row.shardingParam ); // 》init glueType $("#addModal .form select[name=glueType]").change(); diff --git a/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl b/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl index 3a5d7d8a..4b715352 100644 --- a/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl +++ b/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl @@ -83,6 +83,7 @@ ${I18n.schedule_type} ${I18n.jobinfo_field_gluetype} ${I18n.jobinfo_field_executorparam} + ${I18n.jobinfo_field_shardingparam} addTime updateTime ${I18n.jobinfo_field_author} @@ -188,6 +189,13 @@ +
+ +
+ +
+
+

${I18n.jobinfo_conf_advanced}

<#-- 高级配置 --> @@ -265,6 +273,7 @@ echo "${I18n.jobinfo_script_location}:$0" echo "${I18n.jobinfo_field_executorparam}:$1" echo "${I18n.jobinfo_shard_index} = $2" echo "${I18n.jobinfo_shard_total} = $3" +echo "${I18n.jobinfo_field_shardingparam}:$4" <#--echo "参数数量:$#" for param in $* do @@ -287,6 +296,7 @@ print "${I18n.jobinfo_script_location}:", sys.argv[0] print "${I18n.jobinfo_field_executorparam}:", sys.argv[1] print "${I18n.jobinfo_shard_index}:", sys.argv[2] print "${I18n.jobinfo_shard_total}:", sys.argv[3] +print "${I18n.jobinfo_field_shardingparam}:", sys.argv[4] <#--for i in range(1, len(sys.argv)): time.sleep(1) print "参数", i, sys.argv[i]--> @@ -309,6 +319,7 @@ logging.info("脚本文件:" + sys.argv[0]) echo "${I18n.jobinfo_field_executorparam}:$argv[1] \n"; echo "${I18n.jobinfo_shard_index} = $argv[2] \n"; echo "${I18n.jobinfo_shard_total} = $argv[3] \n"; + echo "${I18n.jobinfo_field_shardingparam} = $argv[4] \n"; echo "Good bye! \n"; exit(0); @@ -433,6 +444,13 @@ exit 0 +
+ +
+ +
+
+

${I18n.jobinfo_conf_advanced}

<#-- 高级配置 --> diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java b/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java index 4f56368a..51d4bd5b 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java @@ -12,6 +12,7 @@ public class TriggerParam implements Serializable{ private String executorHandler; private String executorParams; + private String shardingParam; private String executorBlockStrategy; private int executorTimeout; @@ -46,6 +47,14 @@ public class TriggerParam implements Serializable{ return executorParams; } + public String getShardingParam() { + return shardingParam; + } + + public void setShardingParam(String shardingParam) { + this.shardingParam = shardingParam; + } + public void setExecutorParams(String executorParams) { this.executorParams = executorParams; } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java b/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java index 7e350129..117e9612 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java @@ -23,6 +23,10 @@ public class XxlJobContext { * job param */ private final String jobParam; + /** + * job param + */ + private final String jobShardingParam; // ---------------------- for log ---------------------- @@ -64,6 +68,7 @@ public class XxlJobContext { public XxlJobContext(long jobId, String jobParam, String jobLogFileName, int shardIndex, int shardTotal) { this.jobId = jobId; this.jobParam = jobParam; + this.jobShardingParam = null; this.jobLogFileName = jobLogFileName; this.shardIndex = shardIndex; this.shardTotal = shardTotal; @@ -71,6 +76,16 @@ public class XxlJobContext { this.handleCode = HANDLE_CODE_SUCCESS; // default success } + public XxlJobContext(long jobId, String jobParam, String jobShardingParam, String jobLogFileName, int shardIndex, int shardTotal) { + this.jobId = jobId; + this.jobParam = jobParam; + this.jobShardingParam = jobShardingParam; + this.jobLogFileName = jobLogFileName; + this.shardIndex = shardIndex; + this.shardTotal = shardTotal; + this.handleCode = HANDLE_CODE_SUCCESS; // default success + } + public long getJobId() { return jobId; } @@ -79,6 +94,10 @@ public class XxlJobContext { return jobParam; } + public String getJobShardingParam() { + return jobShardingParam; + } + public String getJobLogFileName() { return jobLogFileName; } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobHelper.java b/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobHelper.java index eb20c181..e14ad16d 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobHelper.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobHelper.java @@ -48,6 +48,20 @@ public class XxlJobHelper { return xxlJobContext.getJobParam(); } + /** + * current JobParam + * + * @return + */ + public static String getJobShardingParam() { + XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext(); + if (xxlJobContext == null) { + return null; + } + + return xxlJobContext.getJobShardingParam(); + } + // ---------------------- for log ---------------------- /** diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/enums/ExecutorBlockStrategyEnum.java b/xxl-job-core/src/main/java/com/xxl/job/core/enums/ExecutorBlockStrategyEnum.java index a9dc1bea..ca134c2c 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/enums/ExecutorBlockStrategyEnum.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/enums/ExecutorBlockStrategyEnum.java @@ -6,7 +6,7 @@ package com.xxl.job.core.enums; public enum ExecutorBlockStrategyEnum { SERIAL_EXECUTION("Serial execution"), - /*CONCURRENT_EXECUTION("并行"),*/ + CONCURRENT_EXECUTION("Concurrent execution"), DISCARD_LATER("Discard Later"), COVER_EARLY("Cover Early"); 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..29d8772d 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 @@ -5,6 +5,7 @@ import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.context.XxlJobContext; import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.executor.XxlJobExecutor; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.log.XxlJobFileAppender; @@ -103,6 +104,7 @@ public class JobThread extends Thread{ logger.error(e.getMessage(), e); } + ExecutorService executor2 = Executors.newFixedThreadPool(5); // execute while(!toStop){ running = false; @@ -112,7 +114,7 @@ public class JobThread extends Thread{ try { // to check toStop signal, we need cycle, so wo cannot use queue.take(), instand of poll(timeout) triggerParam = triggerQueue.poll(3L, TimeUnit.SECONDS); - if (triggerParam!=null) { + if (triggerParam!=null) { running = true; idleTimes = 0; triggerLogIdSet.remove(triggerParam.getLogId()); @@ -122,6 +124,7 @@ public class JobThread extends Thread{ XxlJobContext xxlJobContext = new XxlJobContext( triggerParam.getJobId(), triggerParam.getExecutorParams(), + triggerParam.getShardingParam(), logFileName, triggerParam.getBroadcastIndex(), triggerParam.getBroadcastTotal()); @@ -130,7 +133,7 @@ public class JobThread extends Thread{ XxlJobContext.setXxlJobContext(xxlJobContext); // execute - XxlJobHelper.log("
----------- xxl-job job execute start -----------
----------- Param:" + xxlJobContext.getJobParam()); + XxlJobHelper.log("
----------- xxl-job job execute start -----------
----------- Param:" + xxlJobContext.getJobParam()+ "Sharding Param:" + xxlJobContext.getJobShardingParam()); if (triggerParam.getExecutorTimeout() > 0) { // limit timeout @@ -161,6 +164,19 @@ public class JobThread extends Thread{ } finally { futureThread.interrupt(); } + } else if (triggerParam.getExecutorBlockStrategy().equals(ExecutorBlockStrategyEnum.CONCURRENT_EXECUTION.name())){ + executor2.execute(new Runnable() { + @Override + public void run() { + try { + // init job context + XxlJobContext.setXxlJobContext(xxlJobContext); + handler.execute(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); } else { // just execute handler.execute(); @@ -225,6 +241,7 @@ public class JobThread extends Thread{ } } } + executor2.shutdown(); // callback trigger request in queue while(triggerQueue !=null && triggerQueue.size()>0){ diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java index 40acac00..a7c5b55c 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java @@ -191,6 +191,7 @@ public class TriggerCallbackThread { XxlJobContext.setXxlJobContext(new XxlJobContext( -1, null, + null, logFileName, -1, -1)); diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java index 759d6625..1d7781b7 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java @@ -1,5 +1,6 @@ package com.xxl.job.executor.service.jobhandler; +import com.xxl.job.core.context.XxlJobContext; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import org.slf4j.Logger; @@ -37,9 +38,13 @@ public class SampleXxlJob { @XxlJob("demoJobHandler") public void demoJobHandler() throws Exception { XxlJobHelper.log("XXL-JOB, Hello World."); - - for (int i = 0; i < 5; i++) { + XxlJobContext jobContext = XxlJobContext.getXxlJobContext(); + logger.info("执行分片:{}, 分片总数:{},执行参数为:{},执行分片参数为:{}", + jobContext.getShardIndex(), jobContext.getShardTotal(), + jobContext.getJobParam(), jobContext.getJobShardingParam()); + for (int i = 0; i < 1; i++) { XxlJobHelper.log("beat at:" + i); + logger.info("beat at:" + i); TimeUnit.SECONDS.sleep(2); } // default success From 27d76a44de8ffc01b247e457719a38fe9bebb84a Mon Sep 17 00:00:00 2001 From: sikadai Date: Sun, 8 May 2022 22:20:24 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=86=E7=89=87?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/db/tables_xxl_job.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql index a3202128..31b895b2 100644 --- a/doc/db/tables_xxl_job.sql +++ b/doc/db/tables_xxl_job.sql @@ -21,6 +21,7 @@ CREATE TABLE `xxl_job_info` ( `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略', `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', + `sharding_param` text DEFAULT NULL COMMENT '执行器分片参数', `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略', `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒', `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数', From e4d5bc1bf79fd311dbdd699816778559440ff0dd Mon Sep 17 00:00:00 2001 From: sikadai Date: Sun, 8 May 2022 22:40:34 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AB=8B=E5=8D=B3?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E4=B8=80=E6=AC=A1=E5=88=86=E7=89=87=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/templates/jobinfo/jobinfo.index.ftl | 6 ++++++ .../xxl/job/executor/service/jobhandler/SampleXxlJob.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl b/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl index 4b715352..91ccf13a 100644 --- a/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl +++ b/xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl @@ -525,6 +525,12 @@ exit 0 +
+ +
+ +
+
diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java index 1d7781b7..049ace3d 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java @@ -45,7 +45,7 @@ public class SampleXxlJob { for (int i = 0; i < 1; i++) { XxlJobHelper.log("beat at:" + i); logger.info("beat at:" + i); - TimeUnit.SECONDS.sleep(2); + TimeUnit.SECONDS.sleep(10); } // default success }