diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java index a26bdb8c..35d838b1 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java @@ -16,8 +16,7 @@ public abstract class NodeBreakComponent extends NodeComponent { public void process() throws Exception { boolean breakFlag = processBreak(); Slot slot = this.getSlot(); - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - slot.setBreakResult(originalClass.getName(), breakFlag); + slot.setBreakResult(this.getMetaValueKey(), breakFlag); } public abstract boolean processBreak() throws Exception; @@ -25,8 +24,7 @@ public abstract class NodeBreakComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public Boolean getItemResultMetaValue(Integer slotIndex) { - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getBreakResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getBreakResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java index a0cbc7f0..9bf9feac 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java @@ -11,6 +11,7 @@ import cn.hutool.core.date.StopWatch; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.ttl.TransmittableThreadLocal; +import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil; import com.yomahub.liteflow.flow.LiteflowResponse; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.executor.NodeExecutor; @@ -429,4 +430,9 @@ public abstract class NodeComponent{ public <T> T getItemResultMetaValue(Integer slotIndex){ return null; } + + protected String getMetaValueKey(){ + Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); + return originalClass.getName(); + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeForComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeForComponent.java index 53675e61..7f65a57e 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeForComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeForComponent.java @@ -16,8 +16,7 @@ public abstract class NodeForComponent extends NodeComponent { public void process() throws Exception { int forCount = processFor(); Slot slot = this.getSlot(); - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - slot.setForResult(originalClass.getName(), forCount); + slot.setForResult(this.getMetaValueKey(), forCount); } public abstract int processFor() throws Exception; @@ -25,8 +24,7 @@ public abstract class NodeForComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public Integer getItemResultMetaValue(Integer slotIndex) { - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getForResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getForResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java index 34105127..c8dc973f 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java @@ -14,8 +14,7 @@ public abstract class NodeIfComponent extends NodeComponent { @Override public void process() throws Exception { boolean result = this.processIf(); - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - this.getSlot().setIfResult(originalClass.getName(), result); + this.getSlot().setIfResult(this.getMetaValueKey(), result); } public abstract boolean processIf() throws Exception; @@ -23,7 +22,6 @@ public abstract class NodeIfComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public Boolean getItemResultMetaValue(Integer slotIndex) { - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getIfResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getIfResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIteratorComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIteratorComponent.java index f8aec09e..6f5068da 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIteratorComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIteratorComponent.java @@ -18,8 +18,7 @@ public abstract class NodeIteratorComponent extends NodeComponent { public void process() throws Exception { Iterator<?> it = processIterator(); Slot slot = this.getSlot(); - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - slot.setIteratorResult(originalClass.getName(), it); + slot.setIteratorResult(this.getMetaValueKey(), it); } public abstract Iterator<?> processIterator() throws Exception; @@ -27,8 +26,7 @@ public abstract class NodeIteratorComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public Iterator<?> getItemResultMetaValue(Integer slotIndex) { - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getIteratorResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getIteratorResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeSwitchComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeSwitchComponent.java index b24e3229..c4320a4e 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeSwitchComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeSwitchComponent.java @@ -20,8 +20,7 @@ public abstract class NodeSwitchComponent extends NodeComponent { @Override public void process() throws Exception { String nodeId = this.processSwitch(); - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - this.getSlot().setSwitchResult(originalClass.getName(), nodeId); + this.getSlot().setSwitchResult(this.getMetaValueKey(), nodeId); } // 用以返回路由节点的beanId @@ -30,8 +29,7 @@ public abstract class NodeSwitchComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public String getItemResultMetaValue(Integer slotIndex) { - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getSwitchResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getSwitchResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java index 446b6587..07e66374 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java @@ -16,8 +16,7 @@ public abstract class NodeWhileComponent extends NodeComponent { public void process() throws Exception { boolean whileFlag = processWhile(); Slot slot = this.getSlot(); - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - slot.setWhileResult(originalClass.getName(), whileFlag); + slot.setWhileResult(this.getMetaValueKey(), whileFlag); } public abstract boolean processWhile() throws Exception; @@ -25,8 +24,7 @@ public abstract class NodeWhileComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public Boolean getItemResultMetaValue(Integer slotIndex) { - Class<?> originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getWhileResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getWhileResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index abf11c14..f39a0b21 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -21,6 +21,7 @@ import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.ComponentCannotRegisterException; import com.yomahub.liteflow.exception.NullNodeTypeException; import com.yomahub.liteflow.flow.element.Chain; +import com.yomahub.liteflow.flow.element.Condition; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; @@ -37,11 +38,12 @@ import com.yomahub.liteflow.spi.holder.ContextAwareHolder; import com.yomahub.liteflow.spi.holder.DeclComponentParserHolder; import com.yomahub.liteflow.util.CopyOnWriteHashMap; import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil; -import com.yomahub.liteflow.util.NodeScanner; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 流程元数据类 @@ -245,7 +247,9 @@ public class FlowBus { // 获取某一个 chainId 下的所有 nodeId public static List<Node> getNodesByChainId(String chainId) { Chain chain = getChain(chainId); - return NodeScanner.getNodesInChain(chain); + return chain.getConditionList().stream().flatMap( + (Function<Condition, Stream<Node>>) condition -> condition.getAllNodeInCondition().stream() + ).collect(Collectors.toList()); } public static Map<String, Node> getNodeMap() { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Condition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Condition.java index 0d4eec6a..667b78be 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Condition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Condition.java @@ -22,6 +22,11 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Condition的抽象类 @@ -103,6 +108,24 @@ public abstract class Condition implements Executable{ } } + public List<Node> getAllNodeInCondition(){ + List<Executable> executableList = this.executableGroup.entrySet().stream().flatMap( + (Function<Map.Entry<String, List<Executable>>, Stream<Executable>>) entry -> entry.getValue().stream() + ).collect(Collectors.toList()); + + List<Node> resultList = new ArrayList<>(); + + executableList.stream().forEach(executable -> { + if (executable instanceof Condition){ + resultList.addAll(((Condition)executable).getAllNodeInCondition()); + }else if(executable instanceof Node){ + resultList.add((Node)executable); + } + }); + + return resultList; + } + public void setExecutableList(List<Executable> executableList) { this.executableGroup.put(ConditionKey.DEFAULT_KEY, executableList); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java index a3746cbd..ea200796 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java @@ -2,6 +2,7 @@ package com.yomahub.liteflow.flow.element; import cn.hutool.core.text.StrFormatter; import cn.hutool.core.util.ObjectUtil; +import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.enums.ConditionTypeEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.FallbackCmpNotFoundException; @@ -162,6 +163,14 @@ public class FallbackNode extends Node { return this.fallbackNode.isAccess(slotIndex); } + @Override + public NodeComponent getInstance() { + if (fallbackNode == null){ + return null; + } + return fallbackNode.getInstance(); + } + @Override public String getId() { return this.fallbackNode == null ? null : this.fallbackNode.getId(); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java index ee75d08d..e3c137d7 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java @@ -180,7 +180,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ } finally { // 移除threadLocal里的信息 - instance.removeRefNode(); + this.getInstance().removeRefNode(); removeSlotIndex(); removeIsEnd(); removeLoopIndex(); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java b/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java deleted file mode 100644 index 95ce4d4e..00000000 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.yomahub.liteflow.util; - -import com.yomahub.liteflow.flow.element.Chain; -import com.yomahub.liteflow.flow.element.Condition; -import com.yomahub.liteflow.flow.element.Executable; -import com.yomahub.liteflow.flow.element.Node; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Queue; - -/** - * 节点扫描器 - * - * @author DaleLee - * @since 2.12.0 - */ -public class NodeScanner { - - /** - * 获取 Chain 中的所有 Node - * - * @param chain Chain - * @return Node 集合 - */ - public static List<Node> getNodesInChain(Chain chain) { - List<Node> result = new ArrayList<>(); - if (chain == null) { - return result; - } - for (Condition condition : chain.getConditionList()) { - result.addAll(getNodesInCondition(condition)); - } - return result; - } - - /** - * 获取 Condition 中的所有 Node - * - * @param condition Condition - * @return Node 集合 - */ - public static List<Node> getNodesInCondition(Condition condition) { - List<Node> result = new ArrayList<>(); - if (condition == null) { - return result; - } - - // 层序遍历 - Queue<Executable> queue = new LinkedList<>(); - queue.offer(condition); - - while (!queue.isEmpty()) { - Executable cur = queue.poll(); - if (cur instanceof Condition) { - Map<String, List<Executable>> executableGroup = ((Condition) cur).getExecutableGroup(); - for (List<Executable> executables : executableGroup.values()) { - executables.forEach(queue::offer); - } - } else if (cur instanceof Node) { - result.add((Node) cur); - } - } - - return result; - } -}