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 02140db44b75063407c0ceefa9f94809d062d4ee..1704a31a93648e9d818c3205b35bd62ca0a6416b 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 @@ -30,6 +30,7 @@ import com.yomahub.liteflow.util.JsonUtil; import java.lang.reflect.Method; import java.util.Date; +import java.util.Objects; /** * 普通组件抽象类 @@ -136,9 +137,8 @@ public abstract class NodeComponent{ stopWatch.stop(); final long timeSpent = stopWatch.getTotalTimeMillis(); LOG.info("component[{}] finished in {} milliseconds", this.getDisplayName(), timeSpent); - + cmpStep.setStepData(getStepDataAndClean()); cmpStep.setEndTime(new Date()); - // 往CmpStep中放入时间消耗信息 cmpStep.setTimeSpent(timeSpent); @@ -150,6 +150,16 @@ public abstract class NodeComponent{ } } + private Object getStepDataAndClean(){ + Node node = self.refNodeTL.get(); + Object stepData = null; + if(Objects.nonNull(node)){ + stepData = node.getStepData(); + node.removeStepData(); + } + return stepData; + } + public void doRollback() throws Exception { Slot slot = this.getSlot(); @@ -415,6 +425,9 @@ public abstract class NodeComponent{ return this.refNodeTL.get().getCurrLoopObject(); } + public void setStepData(Object stepData) { + this.refNodeTL.get().setStepData(stepData); + } @Deprecated public void invoke(String chainId, Object param) throws Exception { FlowExecutorHolder.loadInstance().invoke(chainId, param, this.getSlotIndex()); 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 3659586e842f05e84faa900db26118177bad9040..cffcc5523aa214b87600dc58039e95cb7c7c4528 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 @@ -55,6 +55,8 @@ public class Node implements Executable, Cloneable, Rollbackable{ private String cmpData; private String currChainId; + // 当前节点缓存的数据 + private TransmittableThreadLocal stepData = new TransmittableThreadLocal<>(); // node 的 isAccess 结果,主要用于 WhenCondition 的提前 isAccess 判断,避免 isAccess 方法重复执行 private TransmittableThreadLocal accessResult = new TransmittableThreadLocal<>(); @@ -277,6 +279,17 @@ public class Node implements Executable, Cloneable, Rollbackable{ this.accessResult.remove(); } + public T getStepData() { + return (T) this.stepData.get(); + } + + public void setStepData(Object stepData) { + this.stepData.set(stepData); + } + + public void removeStepData() { + this.stepData.remove(); + } public boolean getIsContinueOnErrorResult() { Boolean result = this.isContinueOnErrorResult.get(); return result != null && result; diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/CmpStep.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/CmpStep.java index 4bade848ee888530dd07584d2c0919bdda065851..2915b0d5af88b43f68948152fba09d38c00dfb6b 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/CmpStep.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/CmpStep.java @@ -53,6 +53,9 @@ public class CmpStep { // 当前执行的node private Node refNode; + // 当前执行node缓存的数据 + private Object stepData; + public CmpStep(String nodeId, String nodeName, CmpStepTypeEnum stepType) { this.nodeId = nodeId; @@ -132,6 +135,14 @@ public class CmpStep { this.refNode = refNode; } + public T getStepData() { + return (T) stepData; + } + + public void setStepData(Object stepData) { + this.stepData = stepData; + } + public String buildString() { if (stepType.equals(CmpStepTypeEnum.SINGLE)) { if (StrUtil.isBlank(nodeName)) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/cmpStep/CmpStepTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/cmpStep/CmpStepTest.java index 07e933e24a53187ea0bc7b837c3d240d2e12fcb7..cbb952f00a038ea5723d89e5d019334570a75a58 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/cmpStep/CmpStepTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/cmpStep/CmpStepTest.java @@ -60,6 +60,15 @@ public class CmpStepTest extends BaseTest { Assertions.assertEquals(3, tagSet.size()); + for (CmpStep cmpStep : response.getExecuteStepQueue()) { + if(cmpStep.getNodeId().equals("a")){ + Assertions.assertEquals("ACmp executed!",cmpStep.getStepData()); + }else { + Assertions.assertNull(cmpStep.getStepData()); + } + } + + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/cmpStep/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/cmpStep/cmp/ACmp.java index 78c125ae97c3bf5e6c5e5421d4653cba6c8a3085..7286ccb025fc0da356014bebcfc918335ae519c8 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/cmpStep/cmp/ACmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/cmpStep/cmp/ACmp.java @@ -14,6 +14,7 @@ public class ACmp extends NodeComponent { @Override public void process() throws Exception { Thread.sleep(5000L); + this.setStepData("ACmp executed!"); System.out.println("ACmp executed!"); }