diff --git "a/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" "b/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" index 1645e3d..1222ee5 100644 --- "a/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" +++ "b/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" @@ -1077,6 +1077,8 @@ - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; +- 15、Log地址格式兼容,支持非"/"结尾路径配置; + ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1096,9 +1098,7 @@ - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; -- 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; - - +- 18、执行器回调地址格式兼容,支持非"/"结尾路径配置; ## 七、其他 diff --git "a/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" "b/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" index 1645e3d..1222ee5 100644 --- "a/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" +++ "b/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" @@ -1077,6 +1077,8 @@ - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; +- 15、Log地址格式兼容,支持非"/"结尾路径配置; + ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1096,9 +1098,7 @@ - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; -- 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; - - +- 18、执行器回调地址格式兼容,支持非"/"结尾路径配置; ## 七、其他 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 4ecb461..f58853c 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 @@ -72,14 +72,10 @@ initAdminBizList(adminAddresses, accessToken); // init executor-jobHandlerRepository - if (applicationContext != null) { - initJobHandlerRepository(applicationContext); - } + initJobHandlerRepository(applicationContext); // init logpath - if (logPath!=null && logPath.trim().length()>0) { - XxlJobFileAppender.logPath = logPath; - } + XxlJobFileAppender.initLogPath(logPath); // init executor-server initExecutorServer(port, ip, appName, accessToken); @@ -145,6 +141,10 @@ return jobHandlerRepository.get(name); } private static void initJobHandlerRepository(ApplicationContext applicationContext){ + if (applicationContext == null) { + return; + } + // init job handler action Map serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHandler.class); diff --git "a/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" "b/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" index 1645e3d..1222ee5 100644 --- "a/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" +++ "b/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" @@ -1077,6 +1077,8 @@ - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; +- 15、Log地址格式兼容,支持非"/"结尾路径配置; + ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1096,9 +1098,7 @@ - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; -- 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; - - +- 18、执行器回调地址格式兼容,支持非"/"结尾路径配置; ## 七、其他 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 4ecb461..f58853c 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 @@ -72,14 +72,10 @@ initAdminBizList(adminAddresses, accessToken); // init executor-jobHandlerRepository - if (applicationContext != null) { - initJobHandlerRepository(applicationContext); - } + initJobHandlerRepository(applicationContext); // init logpath - if (logPath!=null && logPath.trim().length()>0) { - XxlJobFileAppender.logPath = logPath; - } + XxlJobFileAppender.initLogPath(logPath); // init executor-server initExecutorServer(port, ip, appName, accessToken); @@ -145,6 +141,10 @@ return jobHandlerRepository.get(name); } private static void initJobHandlerRepository(ApplicationContext applicationContext){ + if (applicationContext == null) { + return; + } + // init job handler action Map serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHandler.class); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java index 93ca86a..70ebb7a 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java @@ -36,20 +36,20 @@ String scriptFileName = null; if (GlueTypeEnum.GLUE_SHELL == glueType) { cmd = "bash"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); } else if (GlueTypeEnum.GLUE_PYTHON == glueType) { cmd = "python"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); } else if (GlueTypeEnum.GLUE_NODEJS == glueType) { cmd = "node"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".js"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".js"); } // make script file ScriptUtil.markScriptFile(scriptFileName, gluesource); // log file - String logFileName = XxlJobFileAppender.logPath.concat(XxlJobFileAppender.contextHolder.get()); + String logFileName = XxlJobFileAppender.getLogPath().concat(XxlJobFileAppender.contextHolder.get()); // invoke XxlJobLogger.log("----------- script file:"+ scriptFileName +" -----------"); diff --git "a/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" "b/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" index 1645e3d..1222ee5 100644 --- "a/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" +++ "b/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" @@ -1077,6 +1077,8 @@ - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; +- 15、Log地址格式兼容,支持非"/"结尾路径配置; + ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1096,9 +1098,7 @@ - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; -- 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; - - +- 18、执行器回调地址格式兼容,支持非"/"结尾路径配置; ## 七、其他 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 4ecb461..f58853c 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 @@ -72,14 +72,10 @@ initAdminBizList(adminAddresses, accessToken); // init executor-jobHandlerRepository - if (applicationContext != null) { - initJobHandlerRepository(applicationContext); - } + initJobHandlerRepository(applicationContext); // init logpath - if (logPath!=null && logPath.trim().length()>0) { - XxlJobFileAppender.logPath = logPath; - } + XxlJobFileAppender.initLogPath(logPath); // init executor-server initExecutorServer(port, ip, appName, accessToken); @@ -145,6 +141,10 @@ return jobHandlerRepository.get(name); } private static void initJobHandlerRepository(ApplicationContext applicationContext){ + if (applicationContext == null) { + return; + } + // init job handler action Map serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHandler.class); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java index 93ca86a..70ebb7a 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java @@ -36,20 +36,20 @@ String scriptFileName = null; if (GlueTypeEnum.GLUE_SHELL == glueType) { cmd = "bash"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); } else if (GlueTypeEnum.GLUE_PYTHON == glueType) { cmd = "python"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); } else if (GlueTypeEnum.GLUE_NODEJS == glueType) { cmd = "node"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".js"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".js"); } // make script file ScriptUtil.markScriptFile(scriptFileName, gluesource); // log file - String logFileName = XxlJobFileAppender.logPath.concat(XxlJobFileAppender.contextHolder.get()); + String logFileName = XxlJobFileAppender.getLogPath().concat(XxlJobFileAppender.contextHolder.get()); // invoke XxlJobLogger.log("----------- script file:"+ scriptFileName +" -----------"); 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 2ed2f7f..cd6ffac 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 @@ -18,7 +18,28 @@ // for JobThread (support log for child thread of job handler) //public static ThreadLocal contextHolder = new ThreadLocal(); public static final InheritableThreadLocal contextHolder = new InheritableThreadLocal(); - public static String logPath = "/data/applogs/xxl-job/jobhandler/"; + + + private static String logPath = "/data/applogs/xxl-job/jobhandler/"; + public static void initLogPath(String logPath){ + // init + if (logPath!=null && logPath.trim().length()>0) { + /*if (!logPath.endsWith("/")) { + logPath = logPath.concat("/"); + }*/ + XxlJobFileAppender.logPath = logPath; + } + // mk dir + File logPathDir = new File(XxlJobFileAppender.logPath); + if (!logPathDir.exists()) { + logPathDir.mkdirs(); + } + XxlJobFileAppender.logPath = logPathDir.getPath(); + } + public static String getLogPath() { + return logPath; + } + /** * log filename: yyyy-MM-dd/9999.log diff --git "a/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" "b/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" index 1645e3d..1222ee5 100644 --- "a/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" +++ "b/doc/XXL-JOB\345\256\230\346\226\271\346\226\207\346\241\243.md" @@ -1077,6 +1077,8 @@ - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; +- 15、Log地址格式兼容,支持非"/"结尾路径配置; + ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1096,9 +1098,7 @@ - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; -- 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; - - +- 18、执行器回调地址格式兼容,支持非"/"结尾路径配置; ## 七、其他 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 4ecb461..f58853c 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 @@ -72,14 +72,10 @@ initAdminBizList(adminAddresses, accessToken); // init executor-jobHandlerRepository - if (applicationContext != null) { - initJobHandlerRepository(applicationContext); - } + initJobHandlerRepository(applicationContext); // init logpath - if (logPath!=null && logPath.trim().length()>0) { - XxlJobFileAppender.logPath = logPath; - } + XxlJobFileAppender.initLogPath(logPath); // init executor-server initExecutorServer(port, ip, appName, accessToken); @@ -145,6 +141,10 @@ return jobHandlerRepository.get(name); } private static void initJobHandlerRepository(ApplicationContext applicationContext){ + if (applicationContext == null) { + return; + } + // init job handler action Map serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHandler.class); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java index 93ca86a..70ebb7a 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java @@ -36,20 +36,20 @@ String scriptFileName = null; if (GlueTypeEnum.GLUE_SHELL == glueType) { cmd = "bash"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); } else if (GlueTypeEnum.GLUE_PYTHON == glueType) { cmd = "python"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); } else if (GlueTypeEnum.GLUE_NODEJS == glueType) { cmd = "node"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".js"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".js"); } // make script file ScriptUtil.markScriptFile(scriptFileName, gluesource); // log file - String logFileName = XxlJobFileAppender.logPath.concat(XxlJobFileAppender.contextHolder.get()); + String logFileName = XxlJobFileAppender.getLogPath().concat(XxlJobFileAppender.contextHolder.get()); // invoke XxlJobLogger.log("----------- script file:"+ scriptFileName +" -----------"); 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 2ed2f7f..cd6ffac 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 @@ -18,7 +18,28 @@ // for JobThread (support log for child thread of job handler) //public static ThreadLocal contextHolder = new ThreadLocal(); public static final InheritableThreadLocal contextHolder = new InheritableThreadLocal(); - public static String logPath = "/data/applogs/xxl-job/jobhandler/"; + + + private static String logPath = "/data/applogs/xxl-job/jobhandler/"; + public static void initLogPath(String logPath){ + // init + if (logPath!=null && logPath.trim().length()>0) { + /*if (!logPath.endsWith("/")) { + logPath = logPath.concat("/"); + }*/ + XxlJobFileAppender.logPath = logPath; + } + // mk dir + File logPathDir = new File(XxlJobFileAppender.logPath); + if (!logPathDir.exists()) { + logPathDir.mkdirs(); + } + XxlJobFileAppender.logPath = logPathDir.getPath(); + } + public static String getLogPath() { + return logPath; + } + /** * log filename: yyyy-MM-dd/9999.log diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java index 95c199d..dc335a6 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java @@ -28,7 +28,7 @@ */ public static void markScriptFile(String scriptFileName, String content) throws IOException { // filePath/ - File filePathDir = new File(XxlJobFileAppender.logPath); + File filePathDir = new File(XxlJobFileAppender.getLogPath()); if (!filePathDir.exists()) { filePathDir.mkdirs(); }