From ae7fe92fa5e99f86f7a97120cdf98c474c3d576a Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sun, 19 Aug 2018 00:53:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=B0=83=E5=BA=A6=E5=A4=87?= =?UTF-8?q?=E6=B3=A8=E4=B8=AD=E6=A0=87=E6=B3=A8=E4=BB=BB=E5=8A=A1=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E7=B1=BB=E5=9E=8B=EF=BC=8C=E5=A6=82Cron=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E3=80=81=E7=88=B6=E4=BB=BB=E5=8A=A1=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E3=80=81API=E8=A7=A6=E5=8F=91=E7=AD=89=E7=AD=89=EF=BC=8C?= =?UTF-8?q?=E6=96=B9=E4=BE=BF=E6=8E=92=E6=9F=A5=E8=B0=83=E5=BA=A6=E6=97=A5?= =?UTF-8?q?=E5=BF=97=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 2 ++ .../admin/controller/JobInfoController.java | 3 +- .../admin/controller/JobLogController.java | 3 -- .../admin/core/jobbean/RemoteHttpJobBean.java | 3 +- .../core/thread/JobFailMonitorHelper.java | 26 +++++++++++++--- .../core/thread/JobTriggerPoolHelper.java | 8 ++--- .../job/admin/core/trigger/XxlJobTrigger.java | 30 ++++--------------- .../job/admin/service/impl/AdminBizImpl.java | 17 ++--------- .../main/resources/i18n/message.properties | 6 ++++ .../main/resources/i18n/message_en.properties | 6 ++++ .../WEB-INF/template/joblog/joblog.index.ftl | 6 ---- .../main/webapp/static/js/joblog.index.1.js | 6 ---- .../xxl/job/admin/dao/XxlJobLogDaoTest.java | 2 -- 13 files changed, 52 insertions(+), 66 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 1b353ba3..9631e63d 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1238,6 +1238,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 22、新增左侧菜单"运行报表"; - 23、执行器手动设置IP时取消绑定Host的操作,该IP仅供执行器注册使用;修复指定外网IP时无法绑定执行器Host的问题; - 24、取消父子任务不可重复的限制,支持循环任务触发等特殊场景; +- 25、任务调度备注中标注任务触发类型,如Cron触发、父任务触发、API触发等等,方便排查调度日志; +- 26、【迭代中】分片任务失败重试优化,仅重试当前失败的分片; ### TODO LIST diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java index aa201bbc..412669e7 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java @@ -4,6 +4,7 @@ import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; +import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.dao.XxlJobGroupDao; import com.xxl.job.admin.service.XxlJobService; import com.xxl.job.core.biz.model.ReturnT; @@ -90,7 +91,7 @@ public class JobInfoController { @RequestMapping("/trigger") @ResponseBody public ReturnT triggerJob(int id) { - JobTriggerPoolHelper.trigger(id, -1); + JobTriggerPoolHelper.trigger(id, -1, I18nUtil.getString("jobconf_trigger_type_manual")); return ReturnT.SUCCESS; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java index 0b856df2..9a8ac384 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -11,8 +11,6 @@ import com.xxl.job.admin.dao.XxlJobLogDao; import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.model.LogResult; import com.xxl.job.core.biz.model.ReturnT; -import com.xxl.job.core.glue.GlueTypeEnum; -import com.xxl.job.core.rpc.netcom.NetComClientProxy; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.slf4j.Logger; @@ -52,7 +50,6 @@ public class JobLogController { // 执行器列表 List jobGroupList = xxlJobGroupDao.findAll(); model.addAttribute("JobGroupList", jobGroupList); - model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); // 任务 if (jobId > 0) { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java index f565819a..bd5dc1a6 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.core.jobbean; import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; +import com.xxl.job.admin.core.util.I18nUtil; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; @@ -27,7 +28,7 @@ public class RemoteHttpJobBean extends QuartzJobBean { // trigger //XxlJobTrigger.trigger(jobId); - JobTriggerPoolHelper.trigger(jobId, -1); + JobTriggerPoolHelper.trigger(jobId, -1, I18nUtil.getString("jobconf_trigger_type_cron")); } } \ No newline at end of file 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 35e414b1..c5e4dd66 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 @@ -65,8 +65,25 @@ public class JobFailMonitorHelper { } else /*if (IJobHandler.FAIL.getCode() == log.getTriggerCode() || IJobHandler.FAIL.getCode() == log.getHandleCode() || IJobHandler.FAIL_RETRY.getCode() == log.getHandleCode() )*/ { + // job fail, - failAlarm(log); + + // 1、fail retry + XxlJobInfo info = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(log.getJobId()); + + if (log.getExecutorFailRetryCount() > 0) { + + // TODO,分片任务失败重试优化,仅重试失败分片 + + JobTriggerPoolHelper.trigger(log.getJobId(), (log.getExecutorFailRetryCount()-1), I18nUtil.getString("jobconf_trigger_type_retry")); + String retryMsg = "

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_trigger_retry") +"<<<<<<<<<<<
"; + log.setTriggerMsg(log.getTriggerMsg() + retryMsg); + XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(log); + } + + // 2、fail alarm + failAlarm(info, log); + logger.info(">>>>>>>>>>> job monitor, job fail, JobLogId:{}", jobLogId); }/* else { JobFailMonitorHelper.monitor(jobLogId); @@ -89,7 +106,9 @@ public class JobFailMonitorHelper { XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(jobLogId); if (ReturnT.FAIL_CODE == log.getTriggerCode()|| ReturnT.FAIL_CODE==log.getHandleCode()) { // job fail, - failAlarm(log); + XxlJobInfo info = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(log.getJobId()); + + failAlarm(info, log); logger.info(">>>>>>>>>>> job monitor last, job fail, JobLogId:{}", jobLogId); } } @@ -148,10 +167,9 @@ public class JobFailMonitorHelper { * * @param jobLog */ - private void failAlarm(XxlJobLog jobLog){ + private void failAlarm(XxlJobInfo info, XxlJobLog jobLog){ // send monitor email - XxlJobInfo info = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobLog.getJobId()); if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) { String alarmContent = "Alarm Job LogId=" + jobLog.getId(); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java index fec449cb..65060c0a 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java @@ -28,11 +28,11 @@ public class JobTriggerPoolHelper { new ThreadPoolExecutor.CallerRunsPolicy()); - public void addTrigger(final int jobId, final int failRetryCount){ + public void addTrigger(final int jobId, final int failRetryCount, final String type){ triggerPool.execute(new Runnable() { @Override public void run() { - XxlJobTrigger.trigger(jobId, failRetryCount); + XxlJobTrigger.trigger(jobId, failRetryCount, type); } }); } @@ -55,8 +55,8 @@ public class JobTriggerPoolHelper { * <0: use param from job info config * */ - public static void trigger(int jobId, int failRetryCount) { - helper.addTrigger(jobId, failRetryCount); + public static void trigger(int jobId, int failRetryCount, String type) { + helper.addTrigger(jobId, failRetryCount, type); } public static void toStop(){ 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 e01d1cc5..6a2dcd2e 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 @@ -6,7 +6,6 @@ import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; import com.xxl.job.admin.core.thread.JobFailMonitorHelper; -import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.model.ReturnT; @@ -36,7 +35,7 @@ public class XxlJobTrigger { * <0: use param from job info config * */ - public static void trigger(int jobId, int failRetryCount) { + public static void trigger(int jobId, int failRetryCount, String type) { // load data XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobId); // job info @@ -57,7 +56,6 @@ public class XxlJobTrigger { // broadcast if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum && CollectionUtils.isNotEmpty(addressList)) { - boolean onceFailed = false; for (int i = 0; i < addressList.size(); i++) { String address = addressList.get(i); @@ -77,6 +75,7 @@ public class XxlJobTrigger { ReturnT triggerResult = new ReturnT(null); StringBuffer triggerMsgSb = new StringBuffer(); + triggerMsgSb.append(I18nUtil.getString("jobconf_trigger_type")).append(":").append(type); triggerMsgSb.append(I18nUtil.getString("jobconf_trigger_admin_adress")).append(":").append(IpUtil.getIp()); triggerMsgSb.append("
").append(I18nUtil.getString("jobconf_trigger_exe_regtype")).append(":") .append( (group.getAddressType() == 0)?I18nUtil.getString("jobgroup_field_addressType_0"):I18nUtil.getString("jobgroup_field_addressType_1") ); @@ -106,24 +105,13 @@ public class XxlJobTrigger { triggerResult = runExecutor(triggerParam, address); // update03 triggerMsgSb.append("

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_run") +"<<<<<<<<<<<
").append(triggerResult.getMsg()); - - // 4、fail retry) - if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE) { - onceFailed = true; - } - - if (addressList.size()==i+1 && onceFailed && finalFailRetryCount > 0) { // each trigger only retry once - JobTriggerPoolHelper.trigger(jobId, (finalFailRetryCount-1)); - triggerMsgSb.append("

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_trigger_retry") +"<<<<<<<<<<<
"); - } - - // 5、save trigger-info + // 4、save trigger-info jobLog.setExecutorAddress(triggerResult.getContent()); jobLog.setTriggerCode(triggerResult.getCode()); jobLog.setTriggerMsg(triggerMsgSb.toString()); XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(jobLog); - // 6、monitor trigger + // 5、monitor trigger JobFailMonitorHelper.monitor(jobLog.getId()); logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId()); @@ -182,19 +170,13 @@ public class XxlJobTrigger { } - // 4、fail retry - if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && finalFailRetryCount > 0) { - JobTriggerPoolHelper.trigger(jobId, (finalFailRetryCount-1)); - triggerMsgSb.append("

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_trigger_retry") +"<<<<<<<<<<<
"); - } - - // 5、save trigger-info + // 4、save trigger-info jobLog.setExecutorAddress(triggerResult.getContent()); jobLog.setTriggerCode(triggerResult.getCode()); jobLog.setTriggerMsg(triggerMsgSb.toString()); XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(jobLog); - // 6、monitor trigger + // 5、monitor trigger JobFailMonitorHelper.monitor(jobLog.getId()); logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId()); } 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 c31b3c20..14a2e351 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 @@ -7,7 +7,6 @@ import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.dao.XxlJobInfoDao; import com.xxl.job.admin.dao.XxlJobLogDao; import com.xxl.job.admin.dao.XxlJobRegistryDao; -import com.xxl.job.admin.service.XxlJobService; import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.model.HandleCallbackParam; import com.xxl.job.core.biz.model.RegistryParam; @@ -36,8 +35,6 @@ public class AdminBizImpl implements AdminBiz { private XxlJobInfoDao xxlJobInfoDao; @Resource private XxlJobRegistryDao xxlJobRegistryDao; - @Resource - private XxlJobService xxlJobService; @Override @@ -73,7 +70,7 @@ public class AdminBizImpl implements AdminBiz { int childJobId = (StringUtils.isNotBlank(childJobIds[i]) && StringUtils.isNumeric(childJobIds[i]))?Integer.valueOf(childJobIds[i]):-1; if (childJobId > 0) { - JobTriggerPoolHelper.trigger(childJobId, 0); + JobTriggerPoolHelper.trigger(childJobId, 0, I18nUtil.getString("jobconf_trigger_type_parent")); ReturnT triggerChildResult = ReturnT.SUCCESS; // add msg @@ -92,16 +89,6 @@ public class AdminBizImpl implements AdminBiz { } } - } else { - if (log.getExecutorFailRetryCount() > 0) { - int nextFailRetryCount = log.getExecutorFailRetryCount()-1; - - // TODO,广播路由的失败重试,会导致重试暴增,需要优化 - - JobTriggerPoolHelper.trigger(log.getJobId(), nextFailRetryCount); - - callbackMsg = "

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_handle_retry") +"<<<<<<<<<<<
"; - } } // handle msg @@ -142,7 +129,7 @@ public class AdminBizImpl implements AdminBiz { @Override public ReturnT triggerJob(int jobId) { - JobTriggerPoolHelper.trigger(jobId, -1); + JobTriggerPoolHelper.trigger(jobId, -1, I18nUtil.getString("jobconf_trigger_type_api")); return ReturnT.SUCCESS; } diff --git a/xxl-job-admin/src/main/resources/i18n/message.properties b/xxl-job-admin/src/main/resources/i18n/message.properties index 7e0b9e69..1eb03db1 100644 --- a/xxl-job-admin/src/main/resources/i18n/message.properties +++ b/xxl-job-admin/src/main/resources/i18n/message.properties @@ -224,6 +224,12 @@ jobconf_trigger_run=触发调度 jobconf_trigger_child_run=触发子任务 jobconf_callback_child_msg1={0}/{1} [任务ID={2}], 触发{3}, 触发备注: {4}
jobconf_callback_child_msg2={0}/{1} [任务ID={2}], 触发失败, 触发备注: 任务ID格式错误
+jobconf_trigger_type=任务触发类型 +jobconf_trigger_type_cron=Cron触发 +jobconf_trigger_type_manual=手动触发 +jobconf_trigger_type_parent=父任务触发 +jobconf_trigger_type_api=API触发 +jobconf_trigger_type_retry=失败重试触发 ## help job_help=使用教程 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 aa975913..99c83724 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -224,6 +224,12 @@ jobconf_trigger_run=Trigger Job jobconf_trigger_child_run=Trigger child job jobconf_callback_child_msg1={0}/{1} [Job ID={2}], Trigger {3}, Trigger msg: {4}
jobconf_callback_child_msg2={0}/{1} [Job ID={2}], Trigger Fail, Trigger msg: Job ID is illegal
+jobconf_trigger_type=Job trigger type +jobconf_trigger_type_cron=Cron trigger +jobconf_trigger_type_manual=Manual trigger +jobconf_trigger_type_parent=Parent job trigger +jobconf_trigger_type_api=Api trigger +jobconf_trigger_type_retry=Fail retry trigger ## help job_help=Tutorial diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl index a0b27aef..a47d35cc 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl @@ -167,12 +167,6 @@ <@netCommon.commonScript /> - 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 f3686a89..a39d7488 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 @@ -98,14 +98,8 @@ $(function() { "width":'10%', "render": function ( data, type, row ) { - var glueTypeTitle = GlueTypeEnum[row.glueType]; - if (row.executorHandler) { - glueTypeTitle = glueTypeTitle +":" + row.executorHandler; - } - var temp = ''; temp += I18n.joblog_field_executorAddress + ':' + (row.executorAddress?row.executorAddress:''); - temp += '
'+ I18n.jobinfo_field_gluetype +':' + glueTypeTitle; temp += '
'+ I18n.jobinfo_field_executorparam +':' + row.executorParam; return ''+ row.jobId +''+ temp +''; diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogDaoTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogDaoTest.java index 450e28f0..be554ea5 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogDaoTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogDaoTest.java @@ -1,7 +1,6 @@ package com.xxl.job.admin.dao; import com.xxl.job.admin.core.model.XxlJobLog; -import com.xxl.job.admin.dao.XxlJobLogDao; import org.apache.commons.lang3.time.DateUtils; import org.junit.Test; import org.junit.runner.RunWith; @@ -32,7 +31,6 @@ public class XxlJobLogDaoTest { int ret1 = xxlJobLogDao.save(log); XxlJobLog dto = xxlJobLogDao.load(log.getId()); - log.setGlueType("1"); log.setTriggerTime(new Date()); log.setTriggerCode(1); log.setTriggerMsg("1");