From f587f10e324e42d5e55d46f11f708ad5b750040f Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 20 Dec 2017 15:25:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E9=87=8D=E8=AF=95=E5=AE=8C?= =?UTF-8?q?=E6=95=B4=E6=94=AF=E6=8C=81=EF=BC=9A=E4=BB=BB=E5=8A=A1=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=88=86=E4=B8=BA=E8=B0=83=E5=BA=A6=E5=92=8C=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=EF=BC=8C=E4=B9=8B=E5=89=8D=E4=BB=85=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=B0=83=E5=BA=A6=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=87=8D=E8=AF=95?= =?UTF-8?q?=EF=BC=9B=E7=9B=AE=E5=89=8D=E6=94=AF=E6=8C=81=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=87=8D=E8=AF=95=EF=BC=8C=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E4=BB=BB=E5=8A=A1=E8=BF=94=E5=9B=9E=E5=80=BC=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 3 +- .../core/thread/JobFailMonitorHelper.java | 9 ++++-- .../job/admin/core/trigger/XxlJobTrigger.java | 2 +- .../job/admin/service/impl/AdminBizImpl.java | 32 +++++++++++++------ .../main/webapp/static/js/joblog.index.1.js | 23 +++++++++++-- .../com/xxl/job/core/handler/IJobHandler.java | 11 ++++++- .../core/handler/impl/ScriptJobHandler.java | 2 +- .../com/xxl/job/core/thread/JobThread.java | 2 +- .../jfinal/jobhandler/DemoJobHandler.java | 2 +- .../jfinal/jobhandler/ShardingJobHandler.java | 2 +- .../service/jobhandler/DemoJobHandler.java | 2 +- .../jobhandler/ShardingJobHandler.java | 2 +- .../service/jobhandler/DemoJobHandler.java | 2 +- .../jobhandler/ShardingJobHandler.java | 2 +- 14 files changed, 69 insertions(+), 27 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index dd9ee7f4..c12fc67c 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1065,6 +1065,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 11、任务Cron长度扩展支持至128位; - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; +- 14、失败重试完整支持:任务流程分为调度和执行,之前仅支持调度失败的重试;目前支持执行失败的重试,通过任务返回值判断。 ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1085,7 +1086,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 16、任务告警邮件优化,调整为表格形式; - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; - 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; -- 19、失败重试完整支持:任务流程分为触发和执行,目前仅支持触发失败的重试;后续支持任务执行失败的重试,通过任务返回值判断。 + 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 a19c1781..ae0411aa 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 @@ -6,6 +6,7 @@ import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; import com.xxl.job.admin.core.util.MailUtil; import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.IJobHandler; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,13 +52,15 @@ public class JobFailMonitorHelper { if (log == null) { continue; } - if (ReturnT.SUCCESS_CODE == log.getTriggerCode() && log.getHandleCode() == 0) { + if (IJobHandler.SUCCESS.getCode() == log.getTriggerCode() && log.getHandleCode() == 0) { JobFailMonitorHelper.monitor(jobLogId); logger.info(">>>>>>>>>>> job monitor, job running, JobLogId:{}", jobLogId); - } else if (ReturnT.SUCCESS_CODE == log.getTriggerCode() && ReturnT.SUCCESS_CODE == log.getHandleCode()) { + } else if (IJobHandler.SUCCESS.getCode() == log.getHandleCode()) { // job success, pass logger.info(">>>>>>>>>>> job monitor, job success, JobLogId:{}", jobLogId); - } else if (ReturnT.FAIL_CODE == log.getTriggerCode() || ReturnT.FAIL_CODE == log.getHandleCode()) { + } else if (IJobHandler.FAIL.getCode() == log.getTriggerCode() + || IJobHandler.FAIL.getCode() == log.getHandleCode() + || IJobHandler.FAIL_RETRY.getCode() == log.getHandleCode() ) { // job fail, failAlarm(log); logger.info(">>>>>>>>>>> job monitor, job fail, JobLogId:{}", jobLogId); 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 7caec5fa..14f07bbd 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 @@ -171,7 +171,7 @@ public class XxlJobTrigger { // 4.3、trigger (fail retry) if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_RETRY) { triggerResult = executorRouteStrategyEnum.getRouter().routeRun(triggerParam, addressList); - triggerMsgSb.append("

>>>>>>>>>>>失败重试<<<<<<<<<<<
").append(triggerResult.getMsg()); + triggerMsgSb.append("

>>>>>>>>>>>调度失败重试<<<<<<<<<<<
").append(triggerResult.getMsg()); } } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java index 718b4554..ba75365c 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java @@ -13,6 +13,7 @@ import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.model.HandleCallbackParam; import com.xxl.job.core.biz.model.RegistryParam; import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.IJobHandler; import org.apache.commons.lang.StringUtils; import org.quartz.SchedulerException; import org.slf4j.Logger; @@ -46,7 +47,7 @@ public class AdminBizImpl implements AdminBiz { for (HandleCallbackParam handleCallbackParam: callbackParamList) { ReturnT callbackResult = callback(handleCallbackParam); logger.info(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}", - (callbackResult.getCode()==ReturnT.SUCCESS_CODE?"success":"fail"), handleCallbackParam, callbackResult); + (callbackResult.getCode()==IJobHandler.SUCCESS.getCode()?"success":"fail"), handleCallbackParam, callbackResult); } return ReturnT.SUCCESS; @@ -58,28 +59,39 @@ public class AdminBizImpl implements AdminBiz { if (log == null) { return new ReturnT(ReturnT.FAIL_CODE, "log item not found."); } + if (log.getHandleCode() > 0) { + return new ReturnT(ReturnT.FAIL_CODE, "log repeate callback."); // avoid repeat callback, trigger child job etc + } - // trigger success, to trigger child job, and avoid repeat trigger child job - String childTriggerMsg = null; - if (ReturnT.SUCCESS_CODE==handleCallbackParam.getExecuteResult().getCode() && ReturnT.SUCCESS_CODE!=log.getHandleCode()) { + // trigger success, to trigger child job + String callbackMsg = null; + if (IJobHandler.SUCCESS.getCode() == handleCallbackParam.getExecuteResult().getCode()) { XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(log.getJobId()); if (xxlJobInfo!=null && StringUtils.isNotBlank(xxlJobInfo.getChildJobKey())) { - childTriggerMsg = "
"; + callbackMsg = "

>>>>>>>>>>>触发子任务<<<<<<<<<<<
"; + String[] childJobKeys = xxlJobInfo.getChildJobKey().split(","); for (int i = 0; i < childJobKeys.length; i++) { String[] jobKeyArr = childJobKeys[i].split("_"); if (jobKeyArr!=null && jobKeyArr.length==2) { ReturnT triggerChildResult = xxlJobService.triggerJob(Integer.valueOf(jobKeyArr[1])); + // add msg - childTriggerMsg += MessageFormat.format("
{0}/{1} 触发子任务{2}, 子任务Key: {3}, 子任务触发备注: {4}", - (i+1), childJobKeys.length, (triggerChildResult.getCode()==ReturnT.SUCCESS_CODE?"成功":"失败"), childJobKeys[i], triggerChildResult.getMsg()); + callbackMsg += MessageFormat.format("{0}/{1} [JobKey={2}], 触发{3}, 触发备注: {4}
", + (i+1), childJobKeys.length, childJobKeys[i], (triggerChildResult.getCode()==ReturnT.SUCCESS_CODE?"成功":"失败"), triggerChildResult.getMsg()); } else { - childTriggerMsg += MessageFormat.format("
{0}/{1} 触发子任务失败, 子任务Key格式错误, 子任务Key: {2}", + callbackMsg += MessageFormat.format(" {0}/{1} [JobKey={2}], 触发失败, 触发备注: JobKey格式错误
", (i+1), childJobKeys.length, childJobKeys[i]); } } } + } else if (IJobHandler.FAIL_RETRY.getCode() == handleCallbackParam.getExecuteResult().getCode()){ + ReturnT retryTriggerResult = xxlJobService.triggerJob(log.getJobId()); + callbackMsg = "

>>>>>>>>>>>执行失败重试<<<<<<<<<<<
"; + + callbackMsg += MessageFormat.format("触发{0}, 触发备注: {1}", + (retryTriggerResult.getCode()==ReturnT.SUCCESS_CODE?"成功":"失败"), retryTriggerResult.getMsg()); } // handle msg @@ -90,8 +102,8 @@ public class AdminBizImpl implements AdminBiz { if (handleCallbackParam.getExecuteResult().getMsg() != null) { handleMsg.append(handleCallbackParam.getExecuteResult().getMsg()); } - if (childTriggerMsg !=null) { - handleMsg.append("
子任务触发备注:").append(childTriggerMsg); + if (callbackMsg != null) { + handleMsg.append(callbackMsg); } // success, save log diff --git a/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js b/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js index ff33f400..e9fecf0b 100644 --- a/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js +++ b/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js @@ -146,9 +146,16 @@ $(function() { { "data": 'triggerCode', "render": function ( data, type, row ) { - return (data==200)?'成功':(data==500)?'失败':(data==0)?'':data; + var html = data; + if (data == 200) { + html = '成功'; + } else if (data == 500) { + html = '失败'; + } else if (data == 0) { + html = ''; + } + return html; } - }, { "data": 'triggerMsg', @@ -165,7 +172,17 @@ $(function() { { "data": 'handleCode', "render": function ( data, type, row ) { - return (data==200)?'成功':(data==500)?'失败':(data==0)?'':data; + var html = data; + if (data == 200) { + html = '成功'; + } else if (data == 500) { + html = '失败'; + } else if (data == 501) { + html = '失败重试'; + } else if (data == 0) { + html = ''; + } + return html; } }, { diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java index 246068ef..4be7a970 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java @@ -3,11 +3,20 @@ package com.xxl.job.core.handler; import com.xxl.job.core.biz.model.ReturnT; /** - * remote job handler + * job handler + * * @author xuxueli 2015-12-19 19:06:38 */ public abstract class IJobHandler { + /** success */ + public static final ReturnT SUCCESS = new ReturnT(200, null); + /** fail */ + public static final ReturnT FAIL = new ReturnT(500, null); + /** fail retry */ + public static final ReturnT FAIL_RETRY = new ReturnT(501, null); + + /** * job handler * @param params 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 63fdc8cd..93ca86a4 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 @@ -54,7 +54,7 @@ public class ScriptJobHandler extends IJobHandler { // invoke XxlJobLogger.log("----------- script file:"+ scriptFileName +" -----------"); int exitValue = ScriptUtil.execToFile(cmd, scriptFileName, logFileName, params); - ReturnT result = (exitValue==0)?ReturnT.SUCCESS:new ReturnT(ReturnT.FAIL_CODE, "script exit value("+exitValue+") is failed"); + ReturnT result = (exitValue==0)?IJobHandler.SUCCESS:new ReturnT(IJobHandler.FAIL.getCode(), "script exit value("+exitValue+") is failed"); return result; } 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 6084ef4b..a777f647 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 @@ -120,7 +120,7 @@ public class JobThread extends Thread{ XxlJobLogger.log("
----------- xxl-job job execute start -----------
----------- Params:" + Arrays.toString(handlerParams)); executeResult = handler.execute(handlerParams); if (executeResult == null) { - executeResult = ReturnT.FAIL; + executeResult = IJobHandler.FAIL; } XxlJobLogger.log("
----------- xxl-job job execute end(finish) -----------
----------- ReturnT:" + executeResult); diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java index a33ff3c9..e3f88109 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java @@ -27,7 +27,7 @@ public class DemoJobHandler extends IJobHandler { XxlJobLogger.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } - return ReturnT.SUCCESS; + return SUCCESS; } } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java index 73bbc1df..f2e8a755 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java @@ -29,7 +29,7 @@ public class ShardingJobHandler extends IJobHandler { } } - return ReturnT.SUCCESS; + return SUCCESS; } } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java index b0fb6c01..7d414922 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java @@ -32,7 +32,7 @@ public class DemoJobHandler extends IJobHandler { XxlJobLogger.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } - return ReturnT.SUCCESS; + return SUCCESS; } } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java index 4c0b5c80..e7fd1eb6 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java @@ -33,7 +33,7 @@ public class ShardingJobHandler extends IJobHandler { } } - return ReturnT.SUCCESS; + return SUCCESS; } } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java index 5a9bce0a..353fc5ff 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java @@ -32,7 +32,7 @@ public class DemoJobHandler extends IJobHandler { XxlJobLogger.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } - return ReturnT.SUCCESS; + return SUCCESS; } } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java index 80cf1177..4224f0a2 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java @@ -33,7 +33,7 @@ public class ShardingJobHandler extends IJobHandler { } } - return ReturnT.SUCCESS; + return SUCCESS; } }