Commit 5add5521 by huangfusuper

功能:

1. 添加特殊的补批方式
2. 添加工作流的公共参数
3. 修正脚本运行命令替换
4. 添加java任务返回值携带回写参数
parent f81a2a95
package com.byit.api; package com.byit.api;
import com.byit.dto.specials.SpecialJobParam; import com.byit.dto.specials.SpecialJobParam;
import com.byit.service.ApiFlowOperatingService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -18,10 +19,19 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -18,10 +19,19 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("api/operating/node/") @RequestMapping("api/operating/node/")
public class ApiFlowOperatingController { public class ApiFlowOperatingController {
private final ApiFlowOperatingService apiFlowOperatingService;
public ApiFlowOperatingController(ApiFlowOperatingService apiFlowOperatingService) {
this.apiFlowOperatingService = apiFlowOperatingService;
}
/** /**
* 特殊的补批接口 可以依照魔衣工作流下的某一个节点,自动补批其下所由的节点 * 特殊的补批接口 可以依照魔衣工作流下的某一个节点,自动补批其下所由的节点
* @param specialJobParam 采纳数信息 * @param specialJobParam 采纳数信息
*/ */
@PostMapping("specialRunBatch") @PostMapping("specialRunBatch")
public void specialRunBatch(@RequestBody SpecialJobParam specialJobParam){} public void specialRunBatch(@RequestBody SpecialJobParam specialJobParam){
apiFlowOperatingService.specialRunBatch(specialJobParam);
}
} }
package com.byit.service;
import com.byit.dto.specials.SpecialJobParam;
/**
* 工作流操作实现解耦
*
* @author huangfu
* @date 2020年9月23日11:20:12
*/
public interface ApiFlowOperatingService {
/**
* 另外一种实现的补批接口
* 基于某一节点自动识别下面所有的节点
*
* @param specialJobParam 补批参数
*/
void specialRunBatch(SpecialJobParam specialJobParam);
}
spring: spring:
datasource: datasource:
driver-class-name: com.mysql.jdbc.Driver driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://10.0.10.118:3306/myth-job?Unicode=true&characterEncoding=UTF-8&useSSL=true url: jdbc:mysql://10.0.120.30:3307/myth-job?Unicode=true&characterEncoding=UTF-8&useSSL=true
username: root username: root
password: 123456 password: root
......
package com.byit.dto;
import com.byit.model.Node;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 节点依赖数据载体
*
* @author huangfu
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class NodeRelyDto {
private String relyId;
private Node node;
}
package com.byit.mapper; package com.byit.mapper;
import com.byit.model.Node;
import com.byit.model.NodeDependencyKey; import com.byit.model.NodeDependencyKey;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
@Repository
public interface NodeDependencyMapper { public interface NodeDependencyMapper {
int deleteById(NodeDependencyKey key); int deleteById(NodeDependencyKey key);
...@@ -15,6 +16,7 @@ public interface NodeDependencyMapper { ...@@ -15,6 +16,7 @@ public interface NodeDependencyMapper {
/** /**
* 根据节点id删除依赖关系 * 根据节点id删除依赖关系
*
* @param nodeId * @param nodeId
* @return * @return
*/ */
...@@ -22,6 +24,7 @@ public interface NodeDependencyMapper { ...@@ -22,6 +24,7 @@ public interface NodeDependencyMapper {
/** /**
* 根据节点id查询本节点依赖的节点 * 根据节点id查询本节点依赖的节点
*
* @param nodeId * @param nodeId
* @return * @return
*/ */
...@@ -31,10 +34,18 @@ public interface NodeDependencyMapper { ...@@ -31,10 +34,18 @@ public interface NodeDependencyMapper {
/** /**
* 查询依赖于当前nodeid的节点id * 查询依赖于当前nodeid的节点id
*
* @param nodeId * @param nodeId
* @return * @return
*/ */
List<Integer> findSubNodeList(Integer nodeId); List<Integer> findSubNodeList(Integer nodeId);
List<String> findNodeInfoByNodeId(Integer nodeId); List<String> findNodeInfoByNodeId(Integer nodeId);
/**
* 查询所有节点的依赖节点
* @param nodeIds 所有的节点id
* @return 所有节点的依赖关系
*/
List<NodeDependencyKey> findAllNodeDependencyKey(@Param("nodeIds") List<Integer> nodeIds);
} }
\ No newline at end of file
...@@ -46,7 +46,7 @@ public class Flow implements Serializable { ...@@ -46,7 +46,7 @@ public class Flow implements Serializable {
/** /**
* 当前工作流的介绍 * 当前工作流的介绍
*/ */
@ApiModelProperty("当前工作流的介绍") @ApiModelProperty("当前工作流的公共参数")
private String flowDesc; private String flowDesc;
/** /**
......
...@@ -46,7 +46,7 @@ public class FlowVersion implements Serializable { ...@@ -46,7 +46,7 @@ public class FlowVersion implements Serializable {
/** /**
* 工作流的介绍 * 工作流的介绍
*/ */
@ApiModelProperty("工作流的介绍") @ApiModelProperty("工作流的公共参数")
private String flowDesc; private String flowDesc;
/** /**
......
...@@ -18,6 +18,14 @@ import java.util.List; ...@@ -18,6 +18,14 @@ import java.util.List;
* @create: 2019-12-23 17:33 * @create: 2019-12-23 17:33
*/ */
public interface FlowService { public interface FlowService {
/**
* 查询工作流名称 基于工作流名称查询
*
* @param flowName 工作流名称
* @param workspaceId 工作空间名称ID
* @return 返回对应的
*/
Flow findFlowByName(String flowName, Integer workspaceId);
/** /**
* 查询当天将要运行的工作流 * 查询当天将要运行的工作流
......
package com.byit.service; package com.byit.service;
import com.byit.model.NodeDependencyKey;
import java.util.List; import java.util.List;
/** /**
...@@ -14,4 +16,11 @@ public interface NodeDependencyService { ...@@ -14,4 +16,11 @@ public interface NodeDependencyService {
*/ */
List<Integer> findDependIdByNodeId(Integer nodeId); List<Integer> findDependIdByNodeId(Integer nodeId);
/**
* 查询所有节点的依赖节点
* @param nodeIds 所有的节点id
* @return 所有节点的依赖关系
*/
List<NodeDependencyKey> findAllNodeDependencyKey(List<Integer> nodeIds);
} }
\ No newline at end of file
package com.byit.service.impl; package com.byit.service.impl;
import com.byit.mapper.NodeDependencyMapper; import com.byit.mapper.NodeDependencyMapper;
import com.byit.model.NodeDependencyKey;
import com.byit.service.NodeDependencyService; import com.byit.service.NodeDependencyService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -25,4 +26,9 @@ public class NodeDependencyServiceImpl implements NodeDependencyService { ...@@ -25,4 +26,9 @@ public class NodeDependencyServiceImpl implements NodeDependencyService {
public List<Integer> findDependIdByNodeId(Integer nodeId) { public List<Integer> findDependIdByNodeId(Integer nodeId) {
return nodeDependencyMapper.findDependIdByNodeId(nodeId); return nodeDependencyMapper.findDependIdByNodeId(nodeId);
} }
@Override
public List<NodeDependencyKey> findAllNodeDependencyKey(List<Integer> nodeIds) {
return nodeDependencyMapper.findAllNodeDependencyKey(nodeIds);
}
} }
package com.byit.thread.helper; package com.byit.thread.helper;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSON;
import com.byit.dto.executor.RunParamWrapped;
import com.byit.dto.executor.ScriptParamAndPlaceholderDto;
import com.byit.dto.plugin.JavaTask; import com.byit.dto.plugin.JavaTask;
import com.byit.enums.NodeTypeEnum; import com.byit.enums.NodeTypeEnum;
import com.byit.enums.PlaceholderEnum; import com.byit.enums.PlaceholderEnum;
...@@ -20,12 +23,14 @@ import com.byit.thread.BaseThreadRunHelper; ...@@ -20,12 +23,14 @@ import com.byit.thread.BaseThreadRunHelper;
import com.byit.util.SpringUtil; import com.byit.util.SpringUtil;
import io.netty.util.TimerTask; import io.netty.util.TimerTask;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 排期表操作 * 排期表操作
...@@ -57,16 +62,44 @@ public class ScheduleThreadRunHelper extends BaseThreadRunHelper { ...@@ -57,16 +62,44 @@ public class ScheduleThreadRunHelper extends BaseThreadRunHelper {
log.debug("------排期表查询到有需要存在的节点--------"); log.debug("------排期表查询到有需要存在的节点--------");
//循环遍历添加任务 //循环遍历添加任务
jobTaskSchedules.forEach(mythJobTaskSchedule ->{ jobTaskSchedules.forEach(mythJobTaskSchedule ->{
//除去JAVA任务 //获取运行时参数
if(!NodeTypeEnum.JAVA.getCode().equals(mythJobTaskSchedule.getJobType())){ String runParam = mythJobTaskSchedule.getRunParam();
//获取命令
String command = mythJobTaskSchedule.getRunCommand();
//转换参数对象为参数包装体
RunParamWrapped runParamWrapped = JSON.parseObject(runParam, RunParamWrapped.class);
//当参数包装体不为空时 证明存在参数 或私有或公有
if(runParamWrapped != null) {
//获取到私有参数
String privateParam = runParamWrapped.getPrivateParam();
//获取到公有参数
Map<String,String> publicParam = runParamWrapped.getPublicParamMap();
//将私有参数转换为对应的参数DTO
ScriptParamAndPlaceholderDto scriptParamAndPlaceholderDto = JSON.parseObject(privateParam,ScriptParamAndPlaceholderDto.class);
//脚本参数不为空的时候
if(scriptParamAndPlaceholderDto != null) {
Map<String, String> param = scriptParamAndPlaceholderDto.getParam();
if(CollectionUtil.isNotEmpty(param)){
command = PlaceholderUtils.commandReplace(command,param );
}
}
//公共参数不为空的时候
if(CollectionUtil.isNotEmpty(publicParam)) {
command = PlaceholderUtils.commandReplace(command,publicParam );
}
//替换运行参数中的时间参数
if (ScheduleTypeEnum.NORMAL.getCode().equals(mythJobTaskSchedule.getScheduleType())) { if (ScheduleTypeEnum.NORMAL.getCode().equals(mythJobTaskSchedule.getScheduleType())) {
mythJobTaskSchedule.setRunParam(PlaceholderUtils.formatParam(mythJobTaskSchedule.getRunParam())); mythJobTaskSchedule.setRunParam(PlaceholderUtils.formatParam(privateParam));
} }
String command = mythJobTaskSchedule.getRunCommand(); }
//除去JAVA任务
if(!NodeTypeEnum.JAVA.getCode().equals(mythJobTaskSchedule.getJobType())){
assert command != null; assert command != null;
command = command.replace("${"+ PlaceholderEnum.DATE_PLACEHOLDER.getName()+"}", DateUtil.dateLessDayStr(new Date(),"yyyyMMdd",1)); command = command.replace("${"+ PlaceholderEnum.DATE_PLACEHOLDER.getName()+"}", DateUtil.dateLessDayStr(new Date(),"yyyyMMdd",1));
mythJobTaskSchedule.setRunCommand(command); mythJobTaskSchedule.setRunCommand(command);
} }
Long triggerTime = mythJobTaskSchedule.getTriggerTime(); Long triggerTime = mythJobTaskSchedule.getTriggerTime();
TimerTask timerTask = null; TimerTask timerTask = null;
if (NodeTypeEnum.JAVA.getType().equals(mythJobTaskSchedule.getJobType())) { if (NodeTypeEnum.JAVA.getType().equals(mythJobTaskSchedule.getJobType())) {
......
package com.byit.util;
import cn.hutool.core.collection.CollectionUtil;
import com.byit.dto.NodeRelyDto;
import com.byit.model.Node;
import com.byit.model.NodeDependencyKey;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
/**
* 工作流节点依赖解析工具类
*
* @author huangfu
*/
public class FlowNodeRelyParseUtil {
/**
* 解析当前版本的节点依赖
*
* @param nodeAllList 所有的节点信息
* @param startNodeName 开始的节点名称
* @param allNodeDependencyKey 所有的主键信息
* @return 返回解析之后的节点
*/
public static Set<NodeRelyDto> parseThisVersionNodeRely(List<Node> nodeAllList, String startNodeName, List<NodeDependencyKey> allNodeDependencyKey, boolean hasStart) {
List<NodeRelyDto> tempNodeRelyDtoList = new ArrayList<>(8);
//构建节点id与节点的字典关系
Map<Integer, List<Node>> nodeMap = nodeAllList.stream().collect(Collectors.groupingBy(Node::getNodeId));
//筛选开始节点
Node meetTheCriteriaNode = nodeAllList.stream().filter(node -> startNodeName.equals(node.getNodeName())).findFirst().orElse(null);
if (meetTheCriteriaNode != null) {
//构建一个队列
Queue<Integer> queue = new LinkedList<>();
//初始化开始节点 将开始节点加入到当前的结果集里面 注意开始节点不包含任何依赖
if (hasStart) {
NodeRelyDto nodeRelyDto = new NodeRelyDto();
nodeRelyDto.setNode(meetTheCriteriaNode);
tempNodeRelyDtoList.add(nodeRelyDto);
//构建一个队列初始化
queue.offer(meetTheCriteriaNode.getNodeId());
}else{
List<NodeDependencyKey> nodeDependencyKeys = nodeIdMatch(allNodeDependencyKey, meetTheCriteriaNode.getNodeId());
nodeDependencyKeys.forEach(e ->{
NodeRelyDto nodeRelyDto = new NodeRelyDto();
Node node = nodeMap.get(e.getNodeId()).get(0);
nodeRelyDto.setNode(node);
tempNodeRelyDtoList.add(nodeRelyDto);
//构建一个队列初始化
queue.offer(node.getNodeId());
});
}
while (queue.size() > 0) {
Integer relyNodeId = queue.poll();
//寻找依赖节点是当前节点的节点id
//基于当前节点的id 查询所有依赖该节点的节点
List<NodeDependencyKey> nodeDependencyKeys = nodeIdMatch(allNodeDependencyKey, relyNodeId);
List<NodeRelyDto> nodeRelyDtos = buildRelyNode(nodeDependencyKeys, nodeMap, relyNodeId);
//遍历查询到的所由的依赖节点的信息
if (CollectionUtil.isNotEmpty(nodeRelyDtos)) {
nodeRelyDtos.forEach(nodeRely -> {
//向队列设置一个节点id
queue.offer(nodeRely.getNode().getNodeId());
//添加到最终结果集
tempNodeRelyDtoList.add(nodeRely);
});
}
}
return buildResult(tempNodeRelyDtoList);
}
return null;
}
/**
* 节点匹配
*
* @param allNodeDependencyKey 所有的节点主键
* @param thisNodeId 当前节点的id
* @return 匹配成功的
*/
public static List<NodeDependencyKey> nodeIdMatch(List<NodeDependencyKey> allNodeDependencyKey, Integer thisNodeId) {
List<NodeDependencyKey> nodeDependencyKeys = new ArrayList<>(8);
allNodeDependencyKey.forEach(key -> {
if (key.getDependencyId().equals(thisNodeId)) {
nodeDependencyKeys.add(key);
}
});
return nodeDependencyKeys;
}
/**
* 构建最终的结果
*
* @param tempNodeRelyDtoList 临时结果集
* @return 构建完成的数据
*/
private static Set<NodeRelyDto> buildResult(List<NodeRelyDto> tempNodeRelyDtoList) {
Set<NodeRelyDto> tempNodeRelyDtoSet = new HashSet<>(tempNodeRelyDtoList);
//全部节点构建完毕后 对结果集进行分组 以相同的节点为key 依赖节点为value 构建某一节点的依赖节点
Set<NodeRelyDto> nodeRelyDtoSet = new HashSet<>(8);
Map<Node, List<NodeRelyDto>> resultMap = tempNodeRelyDtoSet.stream().collect(Collectors.groupingBy(NodeRelyDto::getNode));
resultMap.forEach((node, nodeDtoList) -> {
//抽芯构建一个新的
NodeRelyDto nodeRelyDto = new NodeRelyDto();
nodeRelyDto.setNode(node);
List<String> relIdList = nodeDtoList.stream().map(NodeRelyDto::getRelyId).collect(Collectors.toList());
String relIds = StringUtils.join(relIdList, ",");
nodeRelyDto.setRelyId(relIds);
nodeRelyDtoSet.add(nodeRelyDto);
});
return nodeRelyDtoSet;
}
/**
* 构建依赖节点
* <p>
* 将依赖节点构建为节点 包装起来
*
* @param nodeDependencyKeys 当前节点依赖的节点id
* @param nodeMap 节点字典
* @param thisNodeId 当前的节点id
* @return 构建完成的节点信息
*/
private static List<NodeRelyDto> buildRelyNode(List<NodeDependencyKey> nodeDependencyKeys, Map<Integer, List<Node>> nodeMap, Integer thisNodeId) {
return nodeDependencyKeys.stream().map(nodeDependencyKey -> {
List<Node> nodes = nodeMap.get(nodeDependencyKey.getNodeId());
Node node = nodes.get(0);
NodeRelyDto nodeRelyDto = new NodeRelyDto();
nodeRelyDto.setNode(node);
//设置当前的依赖节点
nodeRelyDto.setRelyId(String.valueOf(thisNodeId));
return nodeRelyDto;
}).collect(Collectors.toList());
}
}
\ No newline at end of file
...@@ -25,6 +25,18 @@ ...@@ -25,6 +25,18 @@
where dependency_id = #{nodeId,jdbcType=INTEGER} where dependency_id = #{nodeId,jdbcType=INTEGER}
</select> </select>
<select id="findAllNodeDependencyKey" resultMap="BaseResultMap">
select node_id, dependency_id from node_dependency
<where>
node_id in (
<foreach collection="nodeIds" item="nodeId" separator=",">
#{nodeId}
</foreach>
)
</where>
</select>
<select id="findNodeInfoByNodeId" resultType="string"> <select id="findNodeInfoByNodeId" resultType="string">
select node.node_name select node.node_name
from node_dependency depend from node_dependency depend
......
package com.byit.dto.executor;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Map;
/**
* 运行参数包装逻辑
*
* @author huangfu
* @date 2020年9月24日15:32:39
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class RunParamWrapped implements Serializable {
private static final long serialVersionUID = -2926047980768857364L;
/**
* 公共参数字典
*/
private Map<String,String> publicParamMap;
/**
* 私有参数
*/
private String privateParam;
}
...@@ -5,6 +5,8 @@ import lombok.Builder; ...@@ -5,6 +5,8 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.Map;
/** /**
* @description: 插件端工作流的配置 * @description: 插件端工作流的配置
* @author: gml * @author: gml
...@@ -17,6 +19,11 @@ import lombok.NoArgsConstructor; ...@@ -17,6 +19,11 @@ import lombok.NoArgsConstructor;
public class PluginFlowConfig { public class PluginFlowConfig {
/** /**
* 公共参数
*/
private Map<String,String> publicParam;
/**
* 当前工作流版本的告警的时机(0 不告警, 1 完成时告警, 2 失败时告警, 3 成功时告警) * 当前工作流版本的告警的时机(0 不告警, 1 完成时告警, 2 失败时告警, 3 成功时告警)
*/ */
private String alarmlAction; private String alarmlAction;
......
...@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; ...@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
...@@ -29,7 +30,7 @@ public class SpecialJobParam { ...@@ -29,7 +30,7 @@ public class SpecialJobParam {
/** /**
* 是否补批本节点 1:是 2:否 * 是否补批本节点 1:是 2:否
*/ */
private String supplementStatus; private String supplementStatus = "1";
/** /**
* 开始节点的名称 * 开始节点的名称
...@@ -39,6 +40,16 @@ public class SpecialJobParam { ...@@ -39,6 +40,16 @@ public class SpecialJobParam {
/** /**
* 任务名称 -> 任务参数载体 * 任务名称 -> 任务参数载体
*/ */
Map<String,String> paramCarrier; private Map<String,String> paramCarrier;
/**
* 公共参数
*/
private Map<String,String> publicParam;
/**
* 时间参数
*/
private List<String> repairTimeList;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment