diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index e3797f47..eb623340 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -2903,13 +2903,14 @@ alter table xxl_job_log ### 7.47 版本 v3.5.0 Release Notes[ING] - 1、【新增】GLUE模式开关:新增GLUE模式开关(xxl.job.executor.glueenabled),支持执行器维度设置是否启用GLUE模式; -- 2、【TODO】执行器AccessToken:执行器维度AccessToken,线上化动态管理;执行器间AccessToken隔离,提升安全性; - - 执行器:ExecutorBiz 服务处理、AdminBiz请求发起,统一附加 appname + accessToken; - - 调度中心:AppName 限制不可重复 + accessToken 必填;JobGoup本地缓存;AdminBiz 服务处理 校验参数; -- 3、【TODO】调度中心OpenAPI增强:提供任务管理能力;封装Agent Skill并推送ClawHub; -- 4、【TODO】配置线上化:发送邮箱配置线上管理、线程池配置调整; -- 5、【TODO】任务告警:拆分“告警类型、告警配置”属性,支持Webhook、邮箱多种方式; -- 6、【TODO】任务说明:拆分“任务名称、任务备注”属性,前者用于任务检索,后者用于补充任务描述。 +- 2、【新增】执行器AccessToken:执行器维度隔离设置,提升安全性;线上化动态管理,提升操作效率及体验; +(注意:因为AccessToken调整为执行器维度,OpenAPI通讯协议部分发生变化,调度中心与执行器需要一并升级至v3.5.0;) +- 3、【调整】执行器约束规则调整,AppName限制不可重复; +- 4、【TODO】调度中心OpenAPI增强:提供任务管理能力;封装Agent Skill并推送ClawHub; +- 5、【TODO】配置线上化:发送邮箱配置线上管理、线程池配置调整; +- 6、【TODO】任务告警:拆分“告警类型、告警配置”属性,支持Webhook、邮箱多种方式; +- 7、【TODO】任务说明:拆分“任务名称、任务备注”属性,前者用于任务检索,后者用于补充任务描述。 + ### TODO LIST - 1、调度隔离:调度中心针对不同执行器,各自维护不同的调度和远程触发组件。 diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql index 29a88adb..ae20e078 100644 --- a/doc/db/tables_xxl_job.sql +++ b/doc/db/tables_xxl_job.sql @@ -11,12 +11,13 @@ SET NAMES utf8mb4; CREATE TABLE `xxl_job_group` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `app_name` varchar(64) NOT NULL COMMENT '执行器AppName', - `title` varchar(64) NOT NULL COMMENT '执行器名称', - `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入', - `address_list` text COMMENT '执行器地址列表,多地址逗号分隔', - `update_time` datetime DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_name` varchar(64) NOT NULL COMMENT '执行器AppName', + `title` varchar(64) NOT NULL COMMENT '执行器名称', + `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入', + `address_list` text DEFAULT NULL COMMENT '执行器地址列表,多地址逗号分隔', + `access_token` varchar(255) DEFAULT NULL COMMENT '执行器AccessToken', + `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i_app_name` (`app_name`) USING BTREE ) ENGINE = InnoDB @@ -146,9 +147,9 @@ CREATE TABLE `xxl_job_user` ## —————————————————————— for default data —————————————————— -INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) - VALUES (1, 'xxl-job-executor-sample', '通用执行器Sample', 0, NULL, now()), - (2, 'xxl-job-executor-sample-ai', 'AI执行器Sample', 0, NULL, now()); +INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `access_token`, `update_time`) + VALUES (1, 'xxl-job-executor-sample', '通用执行器Sample', 0, NULL, 'default_token', now()), + (2, 'xxl-job-executor-sample-ai', 'AI执行器Sample', 0, NULL, 'default_token', now()); INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobCodeController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobCodeController.java index 08ea22a5..731fe11e 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobCodeController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobCodeController.java @@ -78,7 +78,7 @@ public class JobCodeController { return Response.ofFail( (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_glue_remark")) ); } if (glueRemark.length()<4 || glueRemark.length()>100) { - return Response.ofFail(I18nUtil.getString("jobinfo_glue_remark_limit")); + return Response.ofFail(I18nUtil.getString("jobinfo_glue_remark") + I18nUtil.getString("system_length_limit") + " 4~100"); } if (XssUtil.hasXss(glueRemark)) { return Response.ofFail(I18nUtil.getString("jobinfo_glue_remark") + I18nUtil.getString("system_invalid")); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobGroupController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobGroupController.java index 6b07970b..f530fd95 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobGroupController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobGroupController.java @@ -77,7 +77,7 @@ public class JobGroupController { return Response.ofFail((I18nUtil.getString("system_please_input")+"AppName") ); } if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) { - return Response.ofFail( I18nUtil.getString("jobgroup_field_appname_length") ); + return Response.ofFail( "AppName " + I18nUtil.getString("system_length_limit") + "4~64"); } if (XssUtil.hasXss(xxlJobGroup.getAppname())) { return Response.ofFail( "AppName"+I18nUtil.getString("system_invalid") ); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobLogController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobLogController.java index bece6c69..b7e5ae0f 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobLogController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/controller/JobLogController.java @@ -193,10 +193,13 @@ public class JobLogController { // valid JobGroup permission JobGroupPermissionUtil.validJobGroupPermission(request, jobInfo.getJobGroup()); + // load group + XxlJobGroup jobGroup = XxlJobAdminBootstrap.getInstance().getXxlJobGroupMapper().load(log.getJobGroup()); + // request of kill Response runResult = null; try { - ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(log.getExecutorAddress()); + ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(log.getExecutorAddress(), jobGroup); runResult = executorBiz.kill(new KillRequest(jobInfo.getId())); } catch (Exception e) { logger.error(e.getMessage(), e); @@ -297,8 +300,11 @@ public class JobLogController { // valid permission JobGroupPermissionUtil.validJobGroupPermission(request, jobLog.getJobGroup()); + // load group + XxlJobGroup jobGroup = XxlJobAdminBootstrap.getInstance().getXxlJobGroupMapper().load(jobLog.getJobGroup()); + // log cat - ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(jobLog.getExecutorAddress()); + ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(jobLog.getExecutorAddress(), jobGroup); Response logResult = executorBiz.log(new LogRequest(logId, jobLog.getTriggerTime().getTime(), fromLineNum)); // is end diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/config/XxlJobAdminBootstrap.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/config/XxlJobAdminBootstrap.java index 893b093e..045308b3 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/config/XxlJobAdminBootstrap.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/config/XxlJobAdminBootstrap.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.business.scheduler.config; import com.xxl.job.admin.business.mapper.*; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.admin.business.scheduler.alarm.JobAlarmer; import com.xxl.job.admin.business.scheduler.complete.JobCompleter; import com.xxl.job.admin.business.scheduler.thread.*; @@ -135,27 +136,41 @@ public class XxlJobAdminBootstrap implements InitializingBean, DisposableBean { // ---------------------- executor-client ---------------------- - private static ConcurrentMap executorBizRepository = new ConcurrentHashMap<>(); - public static ExecutorBiz getExecutorBiz(String address) throws Exception { + private static final ConcurrentMap executorBizRepository = new ConcurrentHashMap<>(); + private static final int EXECUTOR_BIZ_CACHE_MAX_SIZE = 1000; + + /** + * get executor-client + */ + public static ExecutorBiz getExecutorBiz(String address, XxlJobGroup xxlJobGroup) throws Exception { // valid - if (StringTool.isBlank(address)) { + if (StringTool.isBlank(address) || xxlJobGroup == null) { return null; } + address = address.trim(); + String accessToken = xxlJobGroup.getAccessToken(); + String appname = xxlJobGroup.getAppname(); // load-cache - address = address.trim(); - ExecutorBiz executorBiz = executorBizRepository.get(address); + String cacheKey = address + "|" + accessToken + "|" + appname; + ExecutorBiz executorBiz = executorBizRepository.get(cacheKey); if (executorBiz != null) { return executorBiz; } - // set-cache + // new client executorBiz = HttpTool.createClient() .url(address) .timeout(XxlJobAdminBootstrap.getInstance().getTimeout() * 1000) - .header(Const.XXL_JOB_ACCESS_TOKEN, XxlJobAdminBootstrap.getInstance().getAccessToken()) + .header(Const.XXL_JOB_ACCESS_TOKEN, accessToken) + .header(Const.XXL_JOB_APPNAME, appname) .proxy(ExecutorBiz.class); - executorBizRepository.put(address, executorBiz); + executorBizRepository.put(cacheKey, executorBiz); + + // avoid unbounded growth + if (executorBizRepository.size() > EXECUTOR_BIZ_CACHE_MAX_SIZE) { + executorBizRepository.clear(); + } return executorBiz; } @@ -166,9 +181,6 @@ public class XxlJobAdminBootstrap implements InitializingBean, DisposableBean { @Value("${xxl.job.i18n}") private String i18n; - @Value("${xxl.job.accessToken}") - private String accessToken; - @Value("${xxl.job.timeout}") private int timeout; @@ -221,10 +233,6 @@ public class XxlJobAdminBootstrap implements InitializingBean, DisposableBean { return i18n; } - public String getAccessToken() { - return accessToken; - } - public int getTimeout() { return timeout; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/ExecutorRouter.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/ExecutorRouter.java index bb9f6d3d..cde7a403 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/ExecutorRouter.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/ExecutorRouter.java @@ -1,12 +1,11 @@ package com.xxl.job.admin.business.scheduler.route; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.core.openapi.executor.dto.TriggerRequest; import com.xxl.tool.response.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; - /** * Created by xuxueli on 17/3/10. */ @@ -16,9 +15,10 @@ public abstract class ExecutorRouter { /** * route address * - * @param addressList executor address list + * @param triggerRequest trigger request + * @param jobGroup executor group * @return ReturnT.content=address */ - public abstract Response route(TriggerRequest triggerParam, List addressList); + public abstract Response route(TriggerRequest triggerRequest, XxlJobGroup jobGroup); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteBusyover.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteBusyover.java index 20545f21..ded5c43d 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteBusyover.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteBusyover.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.business.scheduler.route.strategy; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.admin.business.scheduler.config.XxlJobAdminBootstrap; import com.xxl.job.admin.business.scheduler.route.ExecutorRouter; import com.xxl.job.admin.framework.util.I18nUtil; @@ -16,13 +17,15 @@ import java.util.List; public class ExecutorRouteBusyover extends ExecutorRouter { @Override - public Response route(TriggerRequest triggerParam, List addressList) { + public Response route(TriggerRequest triggerParam, XxlJobGroup jobGroup) { + List addressList = jobGroup.getRegistryList(); + StringBuffer idleBeatResultSB = new StringBuffer(); for (String address : addressList) { // beat Response idleBeatResult = null; try { - ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(address); + ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(address, jobGroup); idleBeatResult = executorBiz.idleBeat(new IdleBeatRequest(triggerParam.getJobId())); } catch (Exception e) { logger.error(e.getMessage(), e); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteConsistentHash.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteConsistentHash.java index 1ab0e1c5..78540ff2 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteConsistentHash.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteConsistentHash.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.business.scheduler.route.strategy; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.admin.business.scheduler.route.ExecutorRouter; import com.xxl.job.core.openapi.executor.dto.TriggerRequest; import com.xxl.tool.response.Response; @@ -91,7 +92,8 @@ public class ExecutorRouteConsistentHash extends ExecutorRouter { } @Override - public Response route(TriggerRequest triggerParam, List addressList) { + public Response route(TriggerRequest triggerParam, XxlJobGroup jobGroup) { + List addressList = jobGroup.getRegistryList(); String address = hashJob(triggerParam.getJobId(), addressList); return Response.ofSuccess(address); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteFailover.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteFailover.java index b335cbd7..51198ce9 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteFailover.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteFailover.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.business.scheduler.route.strategy; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.admin.business.scheduler.config.XxlJobAdminBootstrap; import com.xxl.job.admin.business.scheduler.route.ExecutorRouter; import com.xxl.job.admin.framework.util.I18nUtil; @@ -15,14 +16,16 @@ import java.util.List; public class ExecutorRouteFailover extends ExecutorRouter { @Override - public Response route(TriggerRequest triggerParam, List addressList) { + public Response route(TriggerRequest triggerParam, XxlJobGroup jobGroup) { + + List addressList = jobGroup.getRegistryList(); StringBuffer beatResultSB = new StringBuffer(); for (String address : addressList) { // beat Response beatResult = null; try { - ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(address); + ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(address, jobGroup); beatResult = executorBiz.beat(); } catch (Exception e) { logger.error(e.getMessage(), e); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteFirst.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteFirst.java index 3bca8101..9c9007c5 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteFirst.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteFirst.java @@ -1,19 +1,18 @@ package com.xxl.job.admin.business.scheduler.route.strategy; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.admin.business.scheduler.route.ExecutorRouter; import com.xxl.job.core.openapi.executor.dto.TriggerRequest; import com.xxl.tool.response.Response; -import java.util.List; - /** * Created by xuxueli on 17/3/10. */ public class ExecutorRouteFirst extends ExecutorRouter { @Override - public Response route(TriggerRequest triggerParam, List addressList){ - return Response.ofSuccess(addressList.get(0)); + public Response route(TriggerRequest triggerParam, XxlJobGroup jobGroup){ + return Response.ofSuccess(jobGroup.getRegistryList().get(0)); } } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLFU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLFU.java index 7aeafae4..eb26a21b 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLFU.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLFU.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.business.scheduler.route.strategy; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.admin.business.scheduler.route.ExecutorRouter; import com.xxl.job.core.openapi.executor.dto.TriggerRequest; import com.xxl.tool.response.Response; @@ -70,7 +71,8 @@ public class ExecutorRouteLFU extends ExecutorRouter { } @Override - public Response route(TriggerRequest triggerParam, List addressList) { + public Response route(TriggerRequest triggerParam, XxlJobGroup jobGroup) { + List addressList = jobGroup.getRegistryList(); String address = route(triggerParam.getJobId(), addressList); return Response.ofSuccess(address); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLRU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLRU.java index 1e1bf023..6759c40b 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLRU.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLRU.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.business.scheduler.route.strategy; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.admin.business.scheduler.route.ExecutorRouter; import com.xxl.job.core.openapi.executor.dto.TriggerRequest; import com.xxl.tool.response.Response; @@ -72,7 +73,8 @@ public class ExecutorRouteLRU extends ExecutorRouter { } @Override - public Response route(TriggerRequest triggerParam, List addressList) { + public Response route(TriggerRequest triggerParam, XxlJobGroup jobGroup) { + List addressList = jobGroup.getRegistryList(); String address = route(triggerParam.getJobId(), addressList); return Response.ofSuccess(address); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLast.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLast.java index 16d902ab..801164c8 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLast.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteLast.java @@ -1,19 +1,18 @@ package com.xxl.job.admin.business.scheduler.route.strategy; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.admin.business.scheduler.route.ExecutorRouter; import com.xxl.job.core.openapi.executor.dto.TriggerRequest; import com.xxl.tool.response.Response; -import java.util.List; - /** * Created by xuxueli on 17/3/10. */ public class ExecutorRouteLast extends ExecutorRouter { @Override - public Response route(TriggerRequest triggerParam, List addressList) { - return Response.ofSuccess(addressList.get(addressList.size()-1)); + public Response route(TriggerRequest triggerParam, XxlJobGroup jobGroup) { + return Response.ofSuccess(jobGroup.getRegistryList().get(jobGroup.getRegistryList().size()-1)); } } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteRandom.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteRandom.java index 2def2b12..fa59f026 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteRandom.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteRandom.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.business.scheduler.route.strategy; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.admin.business.scheduler.route.ExecutorRouter; import com.xxl.job.core.openapi.executor.dto.TriggerRequest; import com.xxl.tool.response.Response; @@ -15,7 +16,8 @@ public class ExecutorRouteRandom extends ExecutorRouter { private static Random localRandom = new Random(); @Override - public Response route(TriggerRequest triggerParam, List addressList) { + public Response route(TriggerRequest triggerParam, XxlJobGroup jobGroup) { + List addressList = jobGroup.getRegistryList(); String address = addressList.get(localRandom.nextInt(addressList.size())); return Response.ofSuccess(address); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteRound.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteRound.java index 13c296e8..ea329456 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteRound.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/route/strategy/ExecutorRouteRound.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.business.scheduler.route.strategy; +import com.xxl.job.admin.business.model.XxlJobGroup; import com.xxl.job.admin.business.scheduler.route.ExecutorRouter; import com.xxl.job.core.openapi.executor.dto.TriggerRequest; import com.xxl.tool.response.Response; @@ -38,7 +39,8 @@ public class ExecutorRouteRound extends ExecutorRouter { } @Override - public Response route(TriggerRequest triggerParam, List addressList) { + public Response route(TriggerRequest triggerParam, XxlJobGroup jobGroup) { + List addressList = jobGroup.getRegistryList(); String address = addressList.get(count(triggerParam.getJobId())%addressList.size()); return Response.ofSuccess(address); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/trigger/JobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/trigger/JobTrigger.java index 2ed506cb..d3b199a4 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/trigger/JobTrigger.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/business/scheduler/trigger/JobTrigger.java @@ -178,7 +178,7 @@ public class JobTrigger { address = group.getRegistryList().get(0); } } else { - routeAddressResult = executorRouteStrategyEnum.getRouter().route(triggerParam, group.getRegistryList()); + routeAddressResult = executorRouteStrategyEnum.getRouter().route(triggerParam, group); if (routeAddressResult.isSuccess()) { address = routeAddressResult.getData(); } @@ -190,7 +190,7 @@ public class JobTrigger { // 4、trigger remote executor Response triggerResult = null; if (address != null) { - triggerResult = doTrigger(triggerParam, address); + triggerResult = doTrigger(triggerParam, address, group); } else { triggerResult = Response.of(XxlJobContext.HANDLE_CODE_FAIL, "Address Router Fail."); } @@ -253,12 +253,13 @@ public class JobTrigger { * * @param triggerParam trigger param * @param address the address + * @param jobGroup job group * @return return */ - private Response doTrigger(TriggerRequest triggerParam, String address){ + private Response doTrigger(TriggerRequest triggerParam, String address, XxlJobGroup jobGroup){ try { // build client - ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(address); + ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(address, jobGroup); // invoke Response runResult = executorBiz.trigger(triggerParam); diff --git a/xxl-job-admin/src/main/resources/application.properties b/xxl-job-admin/src/main/resources/application.properties index 583a728c..b10fd1b5 100644 --- a/xxl-job-admin/src/main/resources/application.properties +++ b/xxl-job-admin/src/main/resources/application.properties @@ -55,9 +55,6 @@ spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory -### xxl-job, access token -xxl.job.accessToken=default_token - ### xxl-job, request executor timeout, by second, default 3s xxl.job.timeout=3 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 9b5f2e2a..426490b2 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -138,7 +138,6 @@ jobinfo_opt_registryinfo=Registry Info jobinfo_opt_next_time=Next trigger time jobinfo_glue_source=GLUE Source jobinfo_glue_remark=Resource Remark -jobinfo_glue_remark_limit=Resource Remark length is limited to 4~100 jobinfo_glue_rollback=Version Backtrack jobinfo_glue_jobid_invalid=Job ID is illegal jobinfo_glue_gluetype_invalid=The job is not GLUE Type @@ -212,8 +211,7 @@ jobgroup_field_registryList=machine address jobgroup_field_registryList_invalid=registry machine address is illegal jobgroup_field_registryList_placeholder=Please enter the machine address, if there are more than one comma separated jobgroup_field_appname_limit=Limit the beginning of a lowercase letter, consists of lowercase letters、number and hyphen. -jobgroup_field_appname_length=AppName length is limited to 4~64 -jobgroup_field_title_length=Title length is limited to 4~12 +jobgroup_field_accesstoken_limit=Limit the beginning of a lowercase letter, consists of lowercase letters and number. jobgroup_field_order_digits=Please enter a positive integer jobgroup_field_orderrange=Order is limited to 1~1000 jobgroup_del_limit_0=Refuse to delete, the executor is being used 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 95e7cc3f..5f89c7ff 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 @@ -31,7 +31,7 @@ system_invalid=非法 system_not_found=不存在 system_nav=导航 system_digits=整数 -system_length_limit=长度限制 +system_length_limit=长度限制为 system_permission_limit=权限拦截 system_welcome=欢迎 system_num_range=数值范围限制 @@ -138,7 +138,6 @@ jobinfo_opt_registryinfo=注册节点 jobinfo_opt_next_time=下次执行时间 jobinfo_glue_source=GLUE源码 jobinfo_glue_remark=源码备注 -jobinfo_glue_remark_limit=源码备注长度限制为4~100 jobinfo_glue_rollback=版本回溯 jobinfo_glue_jobid_invalid=任务ID非法 jobinfo_glue_gluetype_invalid=该任务非GLUE模式 @@ -212,8 +211,7 @@ jobgroup_field_registryList=机器地址 jobgroup_field_registryList_invalid=机器地址格式非法 jobgroup_field_registryList_placeholder=请输入执行器地址列表,多地址逗号分隔 jobgroup_field_appname_limit=限制以小写字母开头,由小写字母、数字和中划线组成 -jobgroup_field_appname_length=AppName长度限制为4~64 -jobgroup_field_title_length=名称长度限制为4~12 +jobgroup_field_accesstoken_limit=限制以小写字母开头,由小写字母、数字组成 jobgroup_field_order_digits=请输入整数 jobgroup_field_orderrange=取值范围为1~1000 jobgroup_del_limit_0=拒绝删除,该执行器使用中 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 c467e711..d73e459f 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 @@ -31,7 +31,7 @@ system_invalid=非法 system_not_found=不存在 system_nav=導航 system_digits=整數 -system_length_limit=長度限制 +system_length_limit=長度限制为 system_permission_limit=權限控管 system_welcome=歡迎 system_num_range=數值範圍限制 @@ -138,7 +138,6 @@ jobinfo_opt_registryinfo=注冊節點 jobinfo_opt_next_time=下次執行時間 jobinfo_glue_source=GLUE源碼 jobinfo_glue_remark=源碼備註 -jobinfo_glue_remark_limit=源碼備註長度限制為4~100 jobinfo_glue_rollback=版本回復 jobinfo_glue_jobid_invalid=任務ID非法 jobinfo_glue_gluetype_invalid=該任務非GLUE模式 @@ -212,8 +211,7 @@ jobgroup_field_registryList=機器地址 jobgroup_field_registryList_invalid=機器地址格式非法 jobgroup_field_registryList_placeholder=請輸入執行器地址列表,多個地址請以逗號分隔 jobgroup_field_appname_limit=限制以小寫字母開頭,由小寫字母、數字和中划線組成 -jobgroup_field_appname_length=AppName長度限制為4~64 -jobgroup_field_title_length=名稱長度限制為4~12 +jobgroup_field_accesstoken_limit=限制以小寫字母開頭,由小寫字母、數字組成 jobgroup_field_order_digits=請輸入整數 jobgroup_field_orderrange=取值範圍為1~1000 jobgroup_del_limit_0=拒絕刪除,該執行器使用中 diff --git a/xxl-job-admin/src/main/resources/mapper/business/XxlJobGroupMapper.xml b/xxl-job-admin/src/main/resources/mapper/business/XxlJobGroupMapper.xml index 55dba957..73039104 100644 --- a/xxl-job-admin/src/main/resources/mapper/business/XxlJobGroupMapper.xml +++ b/xxl-job-admin/src/main/resources/mapper/business/XxlJobGroupMapper.xml @@ -9,6 +9,7 @@ + @@ -18,6 +19,7 @@ t.title, t.address_type, t.address_list, + t.access_token, t.update_time @@ -35,8 +37,8 @@ - INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`, `update_time`) - values ( #{appname}, #{title}, #{addressType}, #{addressList}, #{updateTime} ); + INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`, `access_token`, `update_time`) + values ( #{appname}, #{title}, #{addressType}, #{addressList}, #{accessToken}, #{updateTime} ); @@ -44,6 +46,7 @@ SET `title` = #{title}, `address_type` = #{addressType}, `address_list` = #{addressList}, + `access_token` = #{accessToken}, `update_time` = #{updateTime} WHERE id = #{id} @@ -59,7 +62,7 @@ WHERE t.id = #{id} - SELECT FROM xxl_job_group AS t WHERE t.app_name = #{appname} diff --git a/xxl-job-admin/src/main/resources/templates/business/group.list.ftl b/xxl-job-admin/src/main/resources/templates/business/group.list.ftl index 4fe3ac06..adbd1539 100644 --- a/xxl-job-admin/src/main/resources/templates/business/group.list.ftl +++ b/xxl-job-admin/src/main/resources/templates/business/group.list.ftl @@ -115,6 +115,10 @@ +
+ +
+

@@ -159,6 +163,10 @@
+
+ +
+

@@ -213,14 +221,20 @@ },{ title: 'AppName', field: 'appname', - width: '30', + width: '25', widthUnit: '%', align: 'left' },{ title: I18n.jobgroup_field_title, field: 'title', - width: '30', + width: '25', widthUnit: '%' + },{ + title: 'AccessToken', + field: 'accessToken', + width: '20', + widthUnit: '%', + align: 'left' },{ title: I18n.jobgroup_field_addressType, field: 'addressType', @@ -278,33 +292,46 @@ * init add */ // add validator method - jQuery.validator.addMethod("myValid01", function(value, element) { + jQuery.validator.addMethod("appnameValid", function(value, element) { var length = value.length; var valid = /^[a-z][a-zA-Z0-9-]*$/; return this.optional(element) || valid.test(value); }, I18n.jobgroup_field_appname_limit ); + // add validator method + jQuery.validator.addMethod("accessTokenValid", function(value, element) { + var valid = /^[a-z][a-z0-9]*$/; + return this.optional(element) || valid.test(value); + }, I18n.jobgroup_field_accesstoken_limit ); $.adminTable.initAdd( { url: base_url + "/jobgroup/insert", rules : { appname : { required : true, rangelength:[4,64], - myValid01 : true + appnameValid : true }, title : { required : true, rangelength:[4, 64] + }, + accessToken : { + required : true, + rangelength:[4, 50], + accessTokenValid: true } }, messages : { appname : { required : I18n.system_please_input+"AppName", - rangelength: I18n.jobgroup_field_appname_length , - myValid01: I18n.jobgroup_field_appname_limit + rangelength: I18n.system_length_limit + ' [4~64]' }, title : { required : I18n.system_please_input + I18n.jobgroup_field_title , - rangelength: I18n.jobgroup_field_title_length + rangelength: I18n.system_length_limit + ' [4~12]' , + }, + accessToken : { + required : I18n.system_please_input, + rangelength: I18n.system_length_limit + " [4-50]" } }, writeFormData: function() { @@ -346,28 +373,29 @@ $("#updateModal .form input[name='addressType'][value='"+ row.addressType +"']").click(); // 机器地址 $("#updateModal .form textarea[name='addressList']").val( row.addressList ); + // accessToken + $("#updateModal .form input[name='accessToken']").val( row.accessToken ); }, rules : { - appname : { - required : true, - rangelength:[4,64], - myValid01 : true - }, title : { required : true, rangelength:[4, 64] + }, + accessToken : { + required : false, + rangelength:[4, 50], + accessTokenValid: true } }, messages : { - appname : { - required : I18n.system_please_input+"AppName", - rangelength: I18n.jobgroup_field_appname_length , - myValid01: I18n.jobgroup_field_appname_limit - }, title : { required : I18n.system_please_input + I18n.jobgroup_field_title , - rangelength: I18n.jobgroup_field_title_length + rangelength: I18n.system_length_limit + ' [4~12]' + }, + accessToken : { + required : I18n.system_please_input, + rangelength: I18n.system_lengh_limit + " [4-50]" } }, readFormData: function() { diff --git a/xxl-job-admin/src/main/resources/templates/business/job.code.ftl b/xxl-job-admin/src/main/resources/templates/business/job.code.ftl index 5ddd5ea5..2699c1bf 100644 --- a/xxl-job-admin/src/main/resources/templates/business/job.code.ftl +++ b/xxl-job-admin/src/main/resources/templates/business/job.code.ftl @@ -232,7 +232,7 @@ layer.open({ title: I18n.system_tips , btn: [ I18n.system_ok ], - content: I18n.jobinfo_glue_remark_limit , + content: I18n.system_length_limit + ' [4-100]' , icon: '2' }); return;