diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 1bf5ccc9..12ad5eeb 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1014,29 +1014,31 @@ xuxueli/xxl-job-admin:{指定版本} 执行器配置,配置内容说明: ``` -### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册; +### 调度中心部署根地址 [必填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册; xxl.job.admin.addresses=http://127.0.0.1:8080 ### 调度中心通讯TOKEN [选填]:非空时启用; xxl.job.admin.accessToken=default_token ### 调度中心通讯超时时间[选填],单位秒;默认3s; xxl.job.admin.timeout=3 -### 执行器启用开关 [选填]:默认开启,关闭时不进行执行器初始化; +### 执行器启用开关 [必填]:默认开启,关闭时不进行执行器初始化; xxl.job.executor.enabled=true -### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册 +### 执行器AppName [必填]:执行器心跳注册分组依据;为空则关闭自动注册 xxl.job.executor.appname=xxl-job-executor-sample -### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。 -xxl.job.executor.address= ### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯使用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; xxl.job.executor.ip= ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; xxl.job.executor.port=9999 +### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。 +xxl.job.executor.address= ### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; xxl.job.executor.logretentiondays=30 -### 任务扫描排除路径 [选填] :任务扫描时忽略指定包路径下的Bean;支持配置包路径前缀,多个逗号分隔; +### 执行器任务扫描排除路径 [选填] :Bean模式任务扫描时,忽略指定包路径,非空时生效;支持配置包路径前缀,多个逗号分隔;例如"org.package01"或"org.package01,org.package02" xxl.job.executor.excludedpackage=org.springframework,spring +### 执行器GLUE模式启用开关 [选填] :默认开启,支持全部类型任务;关闭时只支持Bean模式任务、禁用GLUE模式任务; +xxl.job.executor.glueenabled=true ``` #### 步骤三:执行器组件配置 @@ -2900,12 +2902,12 @@ alter table xxl_job_log - 3、【安全】任务RollingLog权限校验完善,防止越权查看任务日志; ### 7.47 版本 v3.5.0 Release Notes[ING] -- 1、【TODO】AccessToken线上化管理:执行期维度,限制操作当前执行期; -- 2、【TODO】调度中心OpenAPI增强:提供任务管理能力;封装Agent Skill并推送ClawHub; -- 3、【TODO】配置线上化:发送邮箱配置线上管理、线程池配置调整; -- 4、【TODO】任务告警:拆分“告警类型、告警配置”属性,支持Webhook、邮箱多种方式; -- 5、【TODO】任务说明:拆分“任务名称、任务描述”属性,前者用于任务检索,后者用于补充任务描述,如参数说明、功能详细介绍等。 -- 6、【TODO】GLUE模式开关:执行器新增GLUE模式配置,支持任务维度启停,满足差异化场景需求; +- 1、【新增】GLUE模式开关:新增GLUE模式开关(xxl.job.executor.glueenabled),支持执行器维度设置是否启用GLUE模式; +- 2、【TODO】AccessToken线上化管理:执行期维度,限制操作当前执行期; +- 3、【TODO】调度中心OpenAPI增强:提供任务管理能力;封装Agent Skill并推送ClawHub; +- 4、【TODO】配置线上化:发送邮箱配置线上管理、线程池配置调整; +- 5、【TODO】任务告警:拆分“告警类型、告警配置”属性,支持Webhook、邮箱多种方式; +- 6、【TODO】任务说明:拆分“任务名称、任务描述”属性,前者用于任务检索,后者用于补充任务描述,如参数说明、功能详细介绍等。 ### TODO LIST 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 42c3bd53..61150923 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 @@ -46,16 +46,17 @@ public class XxlJobExecutor { // ---------------------- field ---------------------- - private String adminAddresses; - private String accessToken; - private int timeout; - private Boolean enabled; - private String appname; - private String address; - private String ip; + private String adminAddresses; // admin address list, such as "http://address" or "http://address01,http://address02" + private String accessToken; // access token + private int timeout = 3; // timeout by second, default 3s + private boolean enabled = true; // executor enable, default true + private String appname; // executor appname + private String ip; // executor server-info private int port; - private String logPath; - private int logRetentionDays; + private String address; // executor registry-address: default use address to registry , otherwise use ip:port if address is null + private String logPath = "/data/applogs/xxl-job/jobhandler"; // executor log-path + private int logRetentionDays = 30; // executor log-retention-days + private boolean glueEnabled = true; // executor glue (non-BEAN) task enable, default true public void setAdminAddresses(String adminAddresses) { this.adminAddresses = adminAddresses; @@ -66,27 +67,30 @@ public class XxlJobExecutor { public void setTimeout(int timeout) { this.timeout = timeout; } - public void setEnabled(Boolean enabled) { + public void setEnabled(boolean enabled) { this.enabled = enabled; } public void setAppname(String appname) { this.appname = appname; } - public void setAddress(String address) { - this.address = address; - } public void setIp(String ip) { this.ip = ip; } public void setPort(int port) { this.port = port; } + public void setAddress(String address) { + this.address = address; + } public void setLogPath(String logPath) { this.logPath = logPath; } public void setLogRetentionDays(int logRetentionDays) { this.logRetentionDays = logRetentionDays; } + public void setGlueEnabled(boolean glueEnabled) { + this.glueEnabled = glueEnabled; + } public String getAccessToken() { return accessToken; @@ -94,11 +98,14 @@ public class XxlJobExecutor { public String getAppname() { return appname; } + public int getPort() { + return port; + } public String getAddress() { return address; } - public int getPort() { - return port; + public boolean getGlueEnabled() { + return glueEnabled; } @@ -120,15 +127,23 @@ public class XxlJobExecutor { */ public void start() throws Exception { - // bind instance - xxlJobExecutor = this; - // valid enabled - if (enabled!=null && !enabled) { + if (!enabled) { logger.info(">>>>>>>>>>> xxl-job executor start fail, enabled:{}", enabled); return; } + // valid param + if (StringTool.isBlank(adminAddresses)) { + throw new RuntimeException("xxl-job executor adminAddresses empty."); + } + if (StringTool.isBlank(appname)) { + throw new RuntimeException("xxl-job executor appname empty."); + } + + // bind instance + xxlJobExecutor = this; + // init logpath XxlJobFileAppender.initLogPath(logPath); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java index 7d61be12..8cd99ecb 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java @@ -33,14 +33,20 @@ public class XxlJobFileAppender { * ---/2017-12-25/821.log * */ - private static String logBasePath = "/data/applogs/xxl-job/jobhandler"; - private static String glueSrcPath = new File(logBasePath, "gluesource").getPath(); - private static String callbackLogPath = new File(logBasePath, "callbacklogs").getPath(); + private static String logBasePath; + private static String glueSrcPath; + private static String callbackLogPath; + + /** + * init log path + */ public static void initLogPath(String logPath) throws IOException { // init - if (StringTool.isNotBlank(logPath)) { - logBasePath = logPath.trim(); + if (StringTool.isBlank(logPath)) { + throw new RuntimeException("xxl-job logPath cannot be empty"); } + logBasePath = logPath.trim(); + // mk base dir File logPathDir = new File(logBasePath); FileTool.createDirectories(logPathDir); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/openapi/impl/ExecutorBizImpl.java b/xxl-job-core/src/main/java/com/xxl/job/core/openapi/impl/ExecutorBizImpl.java index 4bf461aa..7a5d1d00 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/openapi/impl/ExecutorBizImpl.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/openapi/impl/ExecutorBizImpl.java @@ -47,13 +47,23 @@ public class ExecutorBizImpl implements ExecutorBiz { @Override public Response run(TriggerRequest triggerRequest) { - // load old:jobHandler + jobThread + + // load job info:jobHandler + jobThread + glueTypeEnum JobThread jobThread = XxlJobExecutor.getInstance().loadJobThread(triggerRequest.getJobId()); IJobHandler jobHandler = jobThread!=null?jobThread.getHandler():null; String removeOldReason = null; - - // valid:jobHandler + jobThread GlueTypeEnum glueTypeEnum = GlueTypeEnum.match(triggerRequest.getGlueType()); + + // valid glue (non-BEAN) enabled + if (glueTypeEnum != null && GlueTypeEnum.BEAN != glueTypeEnum) { + boolean glueEnabled = XxlJobExecutor.getInstance().getGlueEnabled(); + if (!glueEnabled) { + logger.warn(">>>>>>>>>>> xxl-job executor not support current glue type[{}], please check executor configuration.", glueTypeEnum.getDesc()); + return Response.of(XxlJobContext.HANDLE_CODE_FAIL, "fail, current glue type ["+ glueTypeEnum.getDesc() +"] not supported."); + } + } + + // dispatch handler if (GlueTypeEnum.BEAN == glueTypeEnum) { // new jobhandler diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/resources/application.properties b/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/resources/application.properties index db6b0277..c4b66c76 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/resources/application.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/resources/application.properties @@ -18,6 +18,8 @@ xxl.job.admin.timeout=3 ### xxl-job executor enable, default true xxl.job.executor.enabled=true +### xxl-job executor glue (non-BEAN) task enable, default true +xxl.job.executor.glueenabled=true ### xxl-job executor appname xxl.job.executor.appname=xxl-job-executor-sample-ai ### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/config/XxlJobConfig.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/config/XxlJobConfig.java index e2381b19..123741e5 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/config/XxlJobConfig.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/config/XxlJobConfig.java @@ -28,6 +28,9 @@ public class XxlJobConfig { @Value("${xxl.job.executor.enabled}") private Boolean enabled; + @Value("${xxl.job.executor.glueenabled:true}") + private Boolean glueEnabled; + @Value("${xxl.job.executor.appname}") private String appname; @@ -59,12 +62,13 @@ public class XxlJobConfig { xxlJobSpringExecutor.setTimeout(timeout); xxlJobSpringExecutor.setEnabled(enabled); xxlJobSpringExecutor.setAppname(appname); - xxlJobSpringExecutor.setAddress(address); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); + xxlJobSpringExecutor.setAddress(address); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); xxlJobSpringExecutor.setExcludedPackage(excludedPackage); + xxlJobSpringExecutor.setGlueEnabled(glueEnabled); return xxlJobSpringExecutor; } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties index 78c01da3..b4abad81 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties @@ -18,14 +18,16 @@ xxl.job.admin.timeout=3 xxl.job.executor.enabled=true ### xxl-job executor appname xxl.job.executor.appname=xxl-job-executor-sample -### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null -xxl.job.executor.address= ### xxl-job executor server-info xxl.job.executor.ip= xxl.job.executor.port=9999 +### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null +xxl.job.executor.address= ### xxl-job executor log-path xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### xxl-job executor log-retention-days xxl.job.executor.logretentiondays=30 ### xxl-job executor excluded package, will skip scan job. such as "org.package01" or "org.package01,org.package02" xxl.job.executor.excludedpackage= +### xxl-job executor glue (non-BEAN) task enable, default true +xxl.job.executor.glueenabled=true \ No newline at end of file