From 9785e17fb5565fa489461db866452cc05a21a593 Mon Sep 17 00:00:00 2001 From: xinglj2 <15367481@qq.com> Date: Tue, 9 Jan 2024 17:59:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=BE=9D=E8=B5=96=E3=80=82?= =?UTF-8?q?=20=E5=A6=82=E5=A4=9A=E4=B8=AA=E4=BB=BB=E5=8A=A1=E9=83=BD?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E4=BA=86=E7=9B=B8=E5=90=8CID=E7=9A=84?= =?UTF-8?q?=E5=AD=90=E4=BB=BB=E5=8A=A1=EF=BC=8C=E5=88=99=E8=BF=99=E4=BA=9B?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E9=83=BD=E6=89=A7=E8=A1=8C=E5=AE=8C=E6=AF=95?= =?UTF-8?q?=E6=89=8D=E6=89=A7=E8=A1=8C=E6=AD=A4=E5=AD=90=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/core/complete/XxlJobCompleter.java | 54 ++++++++++++++++++- .../admin/core/conf/XxlJobAdminConfig.java | 7 +++ .../resources/i18n/message_zh_CN.properties | 2 +- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java index 279ad7d1..0167ea26 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java @@ -1,17 +1,22 @@ package com.xxl.job.admin.core.complete; import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.model.XxlJobCheck; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; import com.xxl.job.admin.core.trigger.TriggerTypeEnum; import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.admin.dao.XxlJobCheckDao; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.context.XxlJobContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; /** * @author xuxueli 2020-10-30 20:43:10 @@ -56,7 +61,10 @@ public class XxlJobCompleter { for (int i = 0; i < childJobIds.length; i++) { int childJobId = (childJobIds[i]!=null && childJobIds[i].trim().length()>0 && isNumeric(childJobIds[i]))?Integer.valueOf(childJobIds[i]):-1; if (childJobId > 0) { - + + //save and check dependency + if( ! saveAndCheckChild(xxlJobInfo.getId(), childJobId)) continue; + JobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null, null); ReturnT triggerChildResult = ReturnT.SUCCESS; @@ -87,7 +95,49 @@ public class XxlJobCompleter { } - private static boolean isNumeric(String str){ + //save and check dependency + private static boolean saveAndCheckChild(int doneJobId, int childJobId) { + logger.info("任务{}已完成,检查子任务{}前置", doneJobId, childJobId); + XxlJobCheck check=new XxlJobCheck(); + check.setChildJobId(childJobId); + check.setDoneJobId(doneJobId); + XxlJobCheckDao dao = XxlJobAdminConfig.getAdminConfig().getXxlJobCheckDao(); + dao.save(check); + List done = dao.list(childJobId); + List shouldDone=getAllPreJobId(childJobId); + for(XxlJobCheck each: done) { + shouldDone.remove( each.getDoneJobId()+""); + } + boolean result = false; + if(shouldDone.size()==0) { + logger.info("子任务{}前置全部完成",childJobId); + if(dao.delete(childJobId) ==done.size()) { + logger.info("子任务{}前置满足,将要执行",childJobId); + result =true; + }else { + logger.info("子任务{}前置满足,已被执行!",childJobId); + } + }else { + logger.info("子任务{}等待前置{}完成中",childJobId, shouldDone); + } + return result; + } + + + private static List getAllPreJobId(int childJobId) { + List result = new LinkedList<>(); + List pageList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().pageList(0, Integer.MAX_VALUE, -1, -1, null, null, null); + for(XxlJobInfo info : pageList) { + for(String child: info.getChildJobId().split(",")) { + if(child.trim().equals(childJobId+"")) result.add(""+info.getId()); + } + } + logger.info("{}的前置任务id:{}", childJobId, result.toString() ); + return result; + } + + + private static boolean isNumeric(String str){ try { int result = Integer.valueOf(str); return true; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java index 380b8a59..5932ec44 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java @@ -69,6 +69,9 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean { // dao, service + @Resource + private XxlJobCheckDao xxlJobCheckDao; + @Resource private XxlJobLogDao xxlJobLogDao; @Resource @@ -155,4 +158,8 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean { return jobAlarmer; } + public XxlJobCheckDao getXxlJobCheckDao() { + return xxlJobCheckDao; + } + } 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 dc00c697..5fe40d54 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 @@ -122,7 +122,7 @@ jobinfo_field_alarmemail=报警邮件 jobinfo_field_alarmemail_placeholder=请输入报警邮件,多个邮件地址则逗号分隔 jobinfo_field_executorRouteStrategy=路由策略 jobinfo_field_childJobId=子任务ID -jobinfo_field_childJobId_placeholder=请输入子任务的任务ID,如存在多个则逗号分隔 +jobinfo_field_childJobId_placeholder=请输入子任务的任务ID,如存在多个则逗号分隔。如多个任务都指定了相同ID的子任务,则这些任务都执行完毕才执行此子任务 jobinfo_field_executorBlockStrategy=阻塞处理策略 jobinfo_field_executorFailRetryCount=失败重试次数 jobinfo_field_executorFailRetryCount_placeholder=失败重试次数,大于零时生效