Pre Merge pull request !60 from 立军/I2DVML

pull/60/MERGE
立军 2 years ago committed by Gitee
commit 42b2143729
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F

@ -0,0 +1,25 @@
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50636
Source Host : localhost:3306
Source Database : xxl_job
Target Server Type : MYSQL
Target Server Version : 50636
File Encoding : 65001
Date: 2024-01-09 17:56:29
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `xxl_job_check`
-- ----------------------------
DROP TABLE IF EXISTS `xxl_job_check`;
CREATE TABLE `xxl_job_check` (
`child_jobid` int(11) NOT NULL COMMENT '子任务id',
`done_jobid` int(11) NOT NULL COMMENT '已完成的父任务id'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='子任务的前置任务检查。一旦检查完毕,删除此子任务行,并且运行此此任务。';

@ -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<String> 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<XxlJobCheck> done = dao.list(childJobId);
List<String> 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<String> getAllPreJobId(int childJobId) {
List<String> result = new LinkedList<>();
List<XxlJobInfo> 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;

@ -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;
}
}

@ -0,0 +1,30 @@
package com.xxl.job.admin.core.model;
import java.util.Date;
/**
* xxl-job child job's pre job check
* @author xinglj 2024
*/
public class XxlJobCheck {
private int childJobId, doneJobId;
public int getChildJobId() {
return childJobId;
}
public void setChildJobId(int childJobId) {
this.childJobId = childJobId;
}
public int getDoneJobId() {
return doneJobId;
}
public void setDoneJobId(int doneJobId) {
this.doneJobId = doneJobId;
}
}

@ -0,0 +1,26 @@
package com.xxl.job.admin.dao;
import com.xxl.job.admin.core.model.XxlJobCheck;
import com.xxl.job.admin.core.model.XxlJobLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* job check
*/
@Mapper
public interface XxlJobCheckDao {
// exist jobId not use jobGroup, not exist use jobGroup
public List<XxlJobCheck> list(@Param("childJobId") int childJobId);
public long save(XxlJobCheck xxlJobCheck);
public int delete(@Param("childJobId") int childJobId);
}

@ -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=失败重试次数,大于零时生效

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxl.job.admin.dao.XxlJobCheckDao">
<resultMap id="XxlJobCheck" type="com.xxl.job.admin.core.model.XxlJobCheck" >
<result column="child_jobid" property="childJobId" />
<result column="done_jobid" property="doneJobId" />
</resultMap>
<select id="list" resultMap="XxlJobCheck">
SELECT t.child_jobid, t.done_jobid
FROM xxl_job_check AS t WHERE child_jobid=#{childJobId}
ORDER BY t.done_jobId
</select>
<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobCheck" >
INSERT INTO xxl_job_check (
`child_jobid`,
`done_jobid`
) VALUES (
#{childJobId},
#{doneJobId}
);
</insert>
<delete id="delete" >
delete from xxl_job_check
WHERE child_jobid = #{childJobId}
</delete>
</mapper>
Loading…
Cancel
Save