From c6c8c5bb8018df5292b8485cf25e01f122176173 Mon Sep 17 00:00:00 2001 From: opensnail <598092184@qq.com> Date: Wed, 1 Jan 2025 12:27:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:(1.3.0-beta1.1):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=9E=84=E5=BB=BA=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/service/handler/WorkflowHandler.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/handler/WorkflowHandler.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/handler/WorkflowHandler.java index ca8239d2..85a157bb 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/handler/WorkflowHandler.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/handler/WorkflowHandler.java @@ -129,17 +129,21 @@ public class WorkflowHandler { * @param graph 图 * @param version 版本号 */ - public void buildGraph(List parentIds, LinkedBlockingDeque deque, - String groupName, Long workflowId, + public void buildGraph(List parentIds, LinkedBlockingDeque deque, String groupName, Long workflowId, WorkflowRequestVO.NodeConfig nodeConfig, MutableGraph graph, Integer version) { if (Objects.isNull(nodeConfig)) { return; } + LinkedBlockingDeque tempDeque = null; // 获取节点信息 List conditionNodes = nodeConfig.getConditionNodes(); if (CollUtil.isNotEmpty(conditionNodes)) { + // 一定存在汇合的子节点 + if (Objects.nonNull(nodeConfig.getChildNode())) { + tempDeque = new LinkedBlockingDeque<>(); + } conditionNodes = conditionNodes.stream() .sorted(Comparator.comparing(WorkflowRequestVO.NodeInfo::getPriorityLevel)) .collect(Collectors.toList()); @@ -186,24 +190,35 @@ public class WorkflowHandler { } WorkflowRequestVO.NodeConfig childNode = nodeInfo.getChildNode(); if (Objects.nonNull(childNode) && CollUtil.isNotEmpty(childNode.getConditionNodes())) { - buildGraph(Lists.newArrayList(workflowNode.getId()), deque, groupName, workflowId, childNode, - graph, version); + buildGraph(Lists.newArrayList(workflowNode.getId()), + tempDeque, + groupName, workflowId, childNode, graph, version); } else { if (WorkflowNodeTypeEnum.DECISION.getType() == nodeConfig.getNodeType()) { throw new SnailJobServerException("决策节点或者决策节点的后继节点不能作为叶子节点"); } - // 叶子节点记录一下 - deque.add(workflowNode.getId()); + // 若当前节点无子任何子节点记录一下, 后续存在公共子节点时需要用到 + if (Objects.nonNull(tempDeque)) { + tempDeque.add(workflowNode.getId()); + } else { + // 当前节点无汇合的子节点放到公共的队列 + deque.add(workflowNode.getId()); + } + } } } WorkflowRequestVO.NodeConfig childNode = nodeConfig.getChildNode(); + // 如果存在公共子节点则在这里处理 if (Objects.nonNull(childNode) && CollUtil.isNotEmpty(childNode.getConditionNodes())) { - // 应该是conditionNodes里面叶子节点的选择 + // 是conditionNodes里面叶子节点的 List list = Lists.newArrayList(); - deque.drainTo(list); + if (Objects.nonNull(tempDeque)) { + tempDeque.drainTo(list); + } + buildGraph(list, deque, groupName, workflowId, childNode, graph, version); } }