From 7a7a9ef64d28f6a6c4252f9ccd4d3bcf321e6b3c Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Mon, 13 Jun 2022 17:38:27 +0800 Subject: [PATCH] =?UTF-8?q?bug=20#I5C23U=20=E5=AD=90=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E7=94=A8getChainName=E5=8F=96=E4=B8=8D=E5=88=B0=E5=BD=93?= =?UTF-8?q?=E5=89=8DChainName=E7=9A=84=E9=97=AE=E9=A2=98=20bug=20#I5BZW7?= =?UTF-8?q?=20=E9=9A=90=E5=BC=8F=E6=B5=81=E7=A8=8B=E7=9A=84requestData?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=B8=8D=E5=88=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- liteflow-core/pom.xml | 2 +- .../yomahub/liteflow/core/FlowExecutor.java | 1 - .../yomahub/liteflow/core/NodeComponent.java | 4 +++ .../yomahub/liteflow/flow/element/Chain.java | 25 +++++++++++---- .../java/com/yomahub/liteflow/slot/Slot.java | 32 +++++++++++++++++-- .../yomahub/liteflow/util/LOGOPrinter.java | 2 +- liteflow-script-common/pom.xml | 2 +- liteflow-script-groovy/pom.xml | 2 +- liteflow-script-qlexpress/pom.xml | 2 +- liteflow-spring-boot-starter/pom.xml | 2 +- liteflow-spring/pom.xml | 2 +- liteflow-testcase-declare-component/pom.xml | 2 +- .../ImplicitSubFlowSpringbootTest.java | 2 ++ .../liteflow/test/subflow/cmp2/HCmp.java | 4 +++ liteflow-testcase-nospring/pom.xml | 2 +- .../test/subflow/ImplicitSubFlowTest.java | 2 ++ .../liteflow/test/subflow/cmp2/HCmp.java | 5 +++ liteflow-testcase-script-groovy/pom.xml | 2 +- liteflow-testcase-script-qlexpress/pom.xml | 2 +- liteflow-testcase-springboot/pom.xml | 2 +- .../ImplicitSubFlowSpringbootTest.java | 2 ++ .../liteflow/test/subflow/cmp2/FCmp.java | 3 +- .../liteflow/test/subflow/cmp2/HCmp.java | 4 +++ liteflow-testcase-springnative/pom.xml | 2 +- .../subflow/ImplicitSubFlowSpringTest.java | 2 ++ .../liteflow/test/subflow/cmp2/HCmp.java | 4 +++ pom.xml | 2 +- 27 files changed, 92 insertions(+), 26 deletions(-) diff --git a/liteflow-core/pom.xml b/liteflow-core/pom.xml index 0fffaf78..c2fe5c3e 100644 --- a/liteflow-core/pom.xml +++ b/liteflow-core/pom.xml @@ -9,7 +9,7 @@ com.yomahub liteflow - 2.7.1 + 2.7.2 diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java index 74c5b155..21a47456 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java @@ -370,7 +370,6 @@ public class FlowExecutor { if (ObjectUtil.isNotNull(param)){ slot.setRequestData(param); } - slot.setChainName(chainId); } else { if (ObjectUtil.isNotNull(param)){ slot.setChainReqData(chainId, param); 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 4588d738..7fdd82b1 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 @@ -300,6 +300,10 @@ public abstract class NodeComponent{ return getSlot().getRequestData(); } + public T getSubChainReqData(){ + return getSlot().getChainReqData(this.getChainName()); + } + public String getChainName(){ return getSlot().getChainName(); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Chain.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Chain.java index 529eec75..d4b4965a 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Chain.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Chain.java @@ -28,6 +28,7 @@ import com.yomahub.liteflow.thread.ExecutorHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.xml.crypto.Data; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -83,14 +84,26 @@ public class Chain implements Executable { if (CollUtil.isEmpty(conditionList)) { throw new FlowSystemException("no conditionList in this chain[" + chainName + "]"); } - for (Condition condition : conditionList) { - if (condition instanceof ThenCondition) { - for (Executable executableItem : condition.getNodeList()) { - executableItem.execute(slotIndex); + Slot slot = DataBus.getSlot(slotIndex); + try{ + //在子流程或者隐式流程里,slot需要取到的chainName是当前流程,所以这不再是set,而是push + //其底层结构是一个stack + slot.pushChainName(chainName); + + //循环condition进行执行 + for (Condition condition : conditionList) { + if (condition instanceof ThenCondition) { + for (Executable executableItem : condition.getNodeList()) { + executableItem.execute(slotIndex); + } + } else if (condition instanceof WhenCondition) { + executeAsyncCondition((WhenCondition) condition, slotIndex); } - } else if (condition instanceof WhenCondition) { - executeAsyncCondition((WhenCondition) condition, slotIndex); } + }finally { + //流程结束后,需要把当前的chainName从stack结构中移出 + //里面的逻辑判断了当只剩根chainName的时候,不移除 + slot.popChainName(); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java index 1c7cc3dc..f0bdc1a9 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java @@ -15,6 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Iterator; import java.util.Queue; +import java.util.Stack; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -63,6 +64,10 @@ public class Slot{ this.contextBean = contextBean; } + private boolean hasMetaData(String key){ + return metaDataMap.containsKey(key); + } + private void putMetaDataMap(String key, T t) { if (ObjectUtil.isNull(t)) { //data slot is a ConcurrentHashMap, so null value will trigger NullPointerException @@ -152,12 +157,33 @@ public class Slot{ return (T) metaDataMap.get(COND_NODE_PREFIX + key); } - public void setChainName(String chainName) { - putMetaDataMap(CHAIN_NAME, chainName); + public void pushChainName(String chainName) { + if (this.hasMetaData(CHAIN_NAME)){ + Stack stack = (Stack)metaDataMap.get(CHAIN_NAME); + stack.push(chainName); + }else{ + Stack stack = new Stack<>(); + stack.push(chainName); + this.putMetaDataMap(CHAIN_NAME, stack); + } + } + + public void popChainName(){ + if (this.hasMetaData(CHAIN_NAME)){ + Stack stack = (Stack)metaDataMap.get(CHAIN_NAME); + if (stack.size() > 1){ + stack.pop(); + } + } } public String getChainName() { - return (String) metaDataMap.get(CHAIN_NAME); + try{ + Stack stack = (Stack)metaDataMap.get(CHAIN_NAME); + return stack.peek(); + }catch (Exception e){ + return null; + } } public void addStep(CmpStep step){ diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/util/LOGOPrinter.java b/liteflow-core/src/main/java/com/yomahub/liteflow/util/LOGOPrinter.java index 459eeee2..e4996129 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/util/LOGOPrinter.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/util/LOGOPrinter.java @@ -19,7 +19,7 @@ public class LOGOPrinter { str.append(" | | | | | | | _| _____| |_ | | | | | \\ \\ /\\ / / \n"); str.append(" | |___ | | | | | |__|_____| _| | |__| |_| |\\ V V / \n"); str.append(" |_____|___| |_| |_____| |_| |_____\\___/ \\_/\\_/ \n\n"); - str.append(" Version: v2.7.1\n"); + str.append(" Version: v2.7.2\n"); str.append(" 轻量且强大的规则引擎框架。\n"); str.append(" Small but powerful rules engine.\n"); str.append("================================================================================================\n"); diff --git a/liteflow-script-common/pom.xml b/liteflow-script-common/pom.xml index a3dffa8b..77677ed9 100644 --- a/liteflow-script-common/pom.xml +++ b/liteflow-script-common/pom.xml @@ -5,7 +5,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 4.0.0 diff --git a/liteflow-script-groovy/pom.xml b/liteflow-script-groovy/pom.xml index 6fb669b1..006dcec1 100644 --- a/liteflow-script-groovy/pom.xml +++ b/liteflow-script-groovy/pom.xml @@ -5,7 +5,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 4.0.0 diff --git a/liteflow-script-qlexpress/pom.xml b/liteflow-script-qlexpress/pom.xml index eee133ef..5c64d438 100644 --- a/liteflow-script-qlexpress/pom.xml +++ b/liteflow-script-qlexpress/pom.xml @@ -5,7 +5,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 4.0.0 diff --git a/liteflow-spring-boot-starter/pom.xml b/liteflow-spring-boot-starter/pom.xml index b95c2efd..37873d03 100644 --- a/liteflow-spring-boot-starter/pom.xml +++ b/liteflow-spring-boot-starter/pom.xml @@ -10,7 +10,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 diff --git a/liteflow-spring/pom.xml b/liteflow-spring/pom.xml index 44a8b864..6c0d48e4 100644 --- a/liteflow-spring/pom.xml +++ b/liteflow-spring/pom.xml @@ -5,7 +5,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 4.0.0 diff --git a/liteflow-testcase-declare-component/pom.xml b/liteflow-testcase-declare-component/pom.xml index aea858db..6cbb9079 100644 --- a/liteflow-testcase-declare-component/pom.xml +++ b/liteflow-testcase-declare-component/pom.xml @@ -5,7 +5,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 4.0.0 diff --git a/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringbootTest.java b/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringbootTest.java index ea9af06f..fa014d72 100644 --- a/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringbootTest.java +++ b/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringbootTest.java @@ -45,5 +45,7 @@ public class ImplicitSubFlowSpringbootTest extends BaseTest { Assert.assertEquals(1, RUN_TIME_SLOT.size()); // set中第一次设置的requestId和response中的requestId一致 Assert.assertTrue(RUN_TIME_SLOT.contains(response.getSlot().getRequestId())); + //requestData的取值正确 + Assert.assertEquals("it's implicit subflow.", response.getContextBean().getData("innerRequest")); } } diff --git a/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java b/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java index d8c5eebf..7f2f79b5 100644 --- a/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java +++ b/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java @@ -4,6 +4,7 @@ import com.yomahub.liteflow.annotation.LiteflowCmpDefine; import com.yomahub.liteflow.annotation.LiteflowMethod; import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.slot.DefaultContext; import org.springframework.stereotype.Component; import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowSpringbootTest.RUN_TIME_SLOT; @@ -14,6 +15,9 @@ import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowSpringbootTest.RU public class HCmp{ @LiteflowMethod(LiteFlowMethodEnum.PROCESS) public void process(NodeComponent bindCmp) throws Exception { + String requestData = bindCmp.getSubChainReqData(); + DefaultContext context = bindCmp.getContextBean(); + context.setData("innerRequest", requestData); RUN_TIME_SLOT.add(bindCmp.getSlot().getRequestId()); diff --git a/liteflow-testcase-nospring/pom.xml b/liteflow-testcase-nospring/pom.xml index 27cf19d9..13ef6343 100644 --- a/liteflow-testcase-nospring/pom.xml +++ b/liteflow-testcase-nospring/pom.xml @@ -5,7 +5,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 4.0.0 diff --git a/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowTest.java b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowTest.java index 20f649af..e633a0f7 100644 --- a/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowTest.java +++ b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowTest.java @@ -42,5 +42,7 @@ public class ImplicitSubFlowTest extends BaseTest { Assert.assertEquals(1, RUN_TIME_SLOT.size()); // set中第一次设置的requestId和response中的requestId一致 Assert.assertTrue(RUN_TIME_SLOT.contains(response.getSlot().getRequestId())); + //requestData的取值正确 + Assert.assertEquals("it's implicit subflow.", response.getContextBean().getData("innerRequest")); } } diff --git a/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java index fd78c106..68926cd4 100644 --- a/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java +++ b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java @@ -1,12 +1,17 @@ package com.yomahub.liteflow.test.subflow.cmp2; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; + import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowTest.RUN_TIME_SLOT; public class HCmp extends NodeComponent { @Override public void process() throws Exception { + String requestData = this.getSubChainReqData(); + DefaultContext context = this.getContextBean(); + context.setData("innerRequest", requestData); RUN_TIME_SLOT.add(this.getSlot().getRequestId()); diff --git a/liteflow-testcase-script-groovy/pom.xml b/liteflow-testcase-script-groovy/pom.xml index 464dab8d..5cb568db 100644 --- a/liteflow-testcase-script-groovy/pom.xml +++ b/liteflow-testcase-script-groovy/pom.xml @@ -5,7 +5,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 4.0.0 diff --git a/liteflow-testcase-script-qlexpress/pom.xml b/liteflow-testcase-script-qlexpress/pom.xml index d77ce0fa..16821510 100644 --- a/liteflow-testcase-script-qlexpress/pom.xml +++ b/liteflow-testcase-script-qlexpress/pom.xml @@ -5,7 +5,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 4.0.0 diff --git a/liteflow-testcase-springboot/pom.xml b/liteflow-testcase-springboot/pom.xml index e6030a3b..7bad9704 100644 --- a/liteflow-testcase-springboot/pom.xml +++ b/liteflow-testcase-springboot/pom.xml @@ -5,7 +5,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 4.0.0 diff --git a/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringbootTest.java b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringbootTest.java index ea9af06f..fa014d72 100644 --- a/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringbootTest.java +++ b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringbootTest.java @@ -45,5 +45,7 @@ public class ImplicitSubFlowSpringbootTest extends BaseTest { Assert.assertEquals(1, RUN_TIME_SLOT.size()); // set中第一次设置的requestId和response中的requestId一致 Assert.assertTrue(RUN_TIME_SLOT.contains(response.getSlot().getRequestId())); + //requestData的取值正确 + Assert.assertEquals("it's implicit subflow.", response.getContextBean().getData("innerRequest")); } } diff --git a/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/FCmp.java b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/FCmp.java index 0518434c..3d88daa5 100644 --- a/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/FCmp.java +++ b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/FCmp.java @@ -1,6 +1,7 @@ package com.yomahub.liteflow.test.subflow.cmp2; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; import org.springframework.stereotype.Component; import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowSpringbootTest.RUN_TIME_SLOT; @@ -10,9 +11,7 @@ import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowSpringbootTest.RU public class FCmp extends NodeComponent { @Override public void process() throws Exception { - RUN_TIME_SLOT.add(this.getSlot().getRequestId()); - System.out.println("Fcomp executed!"); } } diff --git a/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java index 176ea0b3..292ccd82 100644 --- a/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java +++ b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java @@ -1,6 +1,7 @@ package com.yomahub.liteflow.test.subflow.cmp2; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; import org.springframework.stereotype.Component; import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowSpringbootTest.RUN_TIME_SLOT; @@ -10,6 +11,9 @@ import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowSpringbootTest.RU public class HCmp extends NodeComponent { @Override public void process() throws Exception { + String requestData = this.getSubChainReqData(); + DefaultContext context = this.getContextBean(); + context.setData("innerRequest", requestData); RUN_TIME_SLOT.add(this.getSlot().getRequestId()); diff --git a/liteflow-testcase-springnative/pom.xml b/liteflow-testcase-springnative/pom.xml index 8d954e89..e4ac2cda 100644 --- a/liteflow-testcase-springnative/pom.xml +++ b/liteflow-testcase-springnative/pom.xml @@ -5,7 +5,7 @@ liteflow com.yomahub - 2.7.1 + 2.7.2 4.0.0 diff --git a/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringTest.java b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringTest.java index f4b712a8..7889d7cb 100644 --- a/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringTest.java +++ b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowSpringTest.java @@ -39,5 +39,7 @@ public class ImplicitSubFlowSpringTest extends BaseTest { Assert.assertEquals(1, RUN_TIME_SLOT.size()); // set中第一次设置的requestId和response中的requestId一致 Assert.assertTrue(RUN_TIME_SLOT.contains(response.getSlot().getRequestId())); + //requestData的取值正确 + Assert.assertEquals("it's implicit subflow.", response.getContextBean().getData("innerRequest")); } } diff --git a/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java index 84688b17..1d05d750 100644 --- a/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java +++ b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/HCmp.java @@ -1,6 +1,7 @@ package com.yomahub.liteflow.test.subflow.cmp2; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; import org.springframework.stereotype.Component; import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowSpringTest.RUN_TIME_SLOT; @@ -10,6 +11,9 @@ import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowSpringTest.RUN_TI public class HCmp extends NodeComponent { @Override public void process() throws Exception { + String requestData = this.getSubChainReqData(); + DefaultContext context = this.getContextBean(); + context.setData("innerRequest", requestData); RUN_TIME_SLOT.add(this.getSlot().getRequestId()); diff --git a/pom.xml b/pom.xml index 14f3adf5..41e2d2b5 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.yomahub liteflow pom - 2.7.1 + 2.7.2 liteflow a lightweight and practical micro-process framework https://github.com/bryan31/liteflow