From 0409561d454b25f1215a787aebff45aca3bf8d57 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Tue, 19 Jul 2022 00:49:26 +0800 Subject: [PATCH] =?UTF-8?q?bug=20#I5F73R=20=E9=9A=90=E5=BC=8F=E5=AD=90?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=A6=82=E6=9E=9C=E6=98=AF=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E7=9A=84=EF=BC=8C=E5=88=99=E5=88=9D=E5=A7=8B=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E5=9C=A8=E5=B9=B6=E5=8F=91=E4=B8=AD=E4=BC=9A=E8=A2=AB=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yomahub/liteflow/slot/Slot.java | 17 +++++++-- .../ImplicitSubFlowELDeclSpringbootTest.java | 15 +++++++- .../liteflow/test/subflow/cmp2/PCmp.java | 35 +++++++++++++++++++ .../liteflow/test/subflow/cmp2/QCmp.java | 33 +++++++++++++++++ .../resources/subflow/flow-implicit.el.xml | 8 +++++ .../test/subflow/ImplicitSubFlowTest.java | 15 +++++++- .../liteflow/test/subflow/cmp2/PCmp.java | 27 ++++++++++++++ .../liteflow/test/subflow/cmp2/QCmp.java | 27 ++++++++++++++ .../resources/subflow/flow-implicit.el.xml | 11 ++++++ .../ImplicitSubFlowELSpringbootTest.java | 15 +++++++- .../liteflow/test/subflow/cmp2/PCmp.java | 32 +++++++++++++++++ .../liteflow/test/subflow/cmp2/QCmp.java | 31 ++++++++++++++++ .../resources/subflow/flow-implicit.el.xml | 8 +++++ .../subflow/ImplicitSubFlowELSpringTest.java | 15 +++++++- .../liteflow/test/subflow/cmp2/PCmp.java | 30 ++++++++++++++++ .../liteflow/test/subflow/cmp2/QCmp.java | 29 +++++++++++++++ .../resources/subflow/flow-implicit.el.xml | 8 +++++ 17 files changed, 350 insertions(+), 6 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java 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 4ba0ed9c9..3b7ae8aa3 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 @@ -7,6 +7,7 @@ */ package com.yomahub.liteflow.slot; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import com.yomahub.liteflow.exception.NoSuchContextBeanException; import com.yomahub.liteflow.exception.NullParamException; @@ -112,11 +113,23 @@ public class Slot{ } public T getChainReqData(String chainId) { - return (T) metaDataMap.get(CHAIN_REQ_PREFIX + chainId); + String key = CHAIN_REQ_PREFIX + chainId; + if (hasMetaData(key)){ + Queue queue = (Queue) metaDataMap.get(key); + return (T)queue.poll(); + }else{ + return null; + } } public void setChainReqData(String chainId, T t) { - putMetaDataMap(CHAIN_REQ_PREFIX + chainId, t); + String key = CHAIN_REQ_PREFIX + chainId; + if (hasMetaData(key)){ + Queue queue = (Queue) metaDataMap.get(key); + queue.offer(t); + }else{ + putMetaDataMap(key, new ConcurrentLinkedQueue<>(ListUtil.toList(t))); + } } public void setPrivateDeliveryData(String nodeId, T t){ diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELDeclSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELDeclSpringbootTest.java index f09b84afd..a8d7fae6e 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELDeclSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELDeclSpringbootTest.java @@ -36,7 +36,7 @@ public class ImplicitSubFlowELDeclSpringbootTest extends BaseTest { //这里GCmp中隐式的调用chain4,从而执行了h,m @Test - public void testImplicitSubFlow() { + public void testImplicitSubFlow1() { LiteflowResponse response = flowExecutor.execute2Resp("chain3", "it's a request"); DefaultContext context = response.getFirstContextBean(); Assert.assertTrue(response.isSuccess()); @@ -49,4 +49,17 @@ public class ImplicitSubFlowELDeclSpringbootTest extends BaseTest { //requestData的取值正确 Assert.assertEquals("it's implicit subflow.", context.getData("innerRequest")); } + + //在p里多线程调用q 10次,每个q取到的参数都是不同的。 + @Test + public void testImplicitSubFlow2() { + LiteflowResponse response = flowExecutor.execute2Resp("c1", "it's a request"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + + Set set = context.getData("test"); + + //requestData的取值正确 + Assert.assertEquals(10, set.size()); + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java new file mode 100644 index 000000000..90ee93c36 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java @@ -0,0 +1,35 @@ +package com.yomahub.liteflow.test.subflow.cmp2; + +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.flow.element.Node; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component("p") +@LiteflowCmpDefine +public class PCmp{ + + @Autowired + private FlowExecutor flowExecutor; + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) throws Exception { + int slotIndex = bindCmp.getSlotIndex(); + for (int i = 0; i < 10; i++) { + int finalI = i; + new Thread(() -> { + try { + flowExecutor.invoke("c2", "it's implicit subflow " + finalI, slotIndex); + } catch (Exception e) { + throw new RuntimeException(e); + } + }).start(); + } + Thread.sleep(1000); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java new file mode 100644 index 000000000..6e9eed294 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java @@ -0,0 +1,33 @@ +package com.yomahub.liteflow.test.subflow.cmp2; + +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 java.util.HashSet; +import java.util.Set; + + +@Component("q") +@LiteflowCmpDefine +public class QCmp{ + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) throws Exception { + String requestData = bindCmp.getSubChainReqData(); + DefaultContext context = bindCmp.getFirstContextBean(); + + synchronized (QCmp.class){ + if (context.hasData("test")){ + Set set = context.getData("test"); + set.add(requestData); + }else{ + Set set = new HashSet<>(); + set.add(requestData); + context.setData("test", set); + } + } + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/subflow/flow-implicit.el.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/subflow/flow-implicit.el.xml index 7e885c1c3..91498014a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/subflow/flow-implicit.el.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/subflow/flow-implicit.el.xml @@ -7,4 +7,12 @@ THEN(h, m); + + + THEN(p); + + + + THEN(q); + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowTest.java index 5fabf4e53..29a2b316e 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowTest.java @@ -34,7 +34,7 @@ public class ImplicitSubFlowTest extends BaseTest { //这里GCmp中隐式的调用chain4,从而执行了h,m @Test - public void testImplicitSubFlow() { + public void testImplicitSubFlow1() { LiteflowResponse response = flowExecutor.execute2Resp("chain3", "it's a request"); DefaultContext context = response.getFirstContextBean(); Assert.assertTrue(response.isSuccess()); @@ -47,4 +47,17 @@ public class ImplicitSubFlowTest extends BaseTest { //requestData的取值正确 Assert.assertEquals("it's implicit subflow.", context.getData("innerRequest")); } + + //在p里多线程调用q 10次,每个q取到的参数都是不同的。 + @Test + public void testImplicitSubFlow2() { + LiteflowResponse response = flowExecutor.execute2Resp("c1", "it's a request"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + + Set set = context.getData("test"); + + //requestData的取值正确 + Assert.assertEquals(10, set.size()); + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java new file mode 100644 index 000000000..b0df4821b --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java @@ -0,0 +1,27 @@ +package com.yomahub.liteflow.test.subflow.cmp2; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.core.FlowExecutorHolder; +import com.yomahub.liteflow.core.NodeComponent; + + +public class PCmp extends NodeComponent { + + private FlowExecutor flowExecutor = FlowExecutorHolder.loadInstance(); + + @Override + public void process() throws Exception { + int slotIndex = this.getSlotIndex(); + for (int i = 0; i < 10; i++) { + int finalI = i; + new Thread(() -> { + try { + flowExecutor.invoke("c2", "it's implicit subflow " + finalI, slotIndex); + } catch (Exception e) { + throw new RuntimeException(e); + } + }).start(); + } + Thread.sleep(1000); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java new file mode 100644 index 000000000..ff53b671b --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java @@ -0,0 +1,27 @@ +package com.yomahub.liteflow.test.subflow.cmp2; + +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; + +import java.util.HashSet; +import java.util.Set; + + +public class QCmp extends NodeComponent { + @Override + public void process() throws Exception { + String requestData = this.getSubChainReqData(); + DefaultContext context = this.getFirstContextBean(); + + synchronized (QCmp.class){ + if (context.hasData("test")){ + Set set = context.getData("test"); + set.add(requestData); + }else{ + Set set = new HashSet<>(); + set.add(requestData); + context.setData("test", set); + } + } + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/flow-implicit.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/flow-implicit.el.xml index 21b46964d..df2d0996d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/flow-implicit.el.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/flow-implicit.el.xml @@ -5,7 +5,10 @@ + + + THEN(f, g); @@ -13,4 +16,12 @@ THEN(h, m); + + + THEN(p); + + + + THEN(q); + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringbootTest.java index 4a119b0ea..d0ce0ab0c 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringbootTest.java @@ -36,7 +36,7 @@ public class ImplicitSubFlowELSpringbootTest extends BaseTest { //这里GCmp中隐式的调用chain4,从而执行了h,m @Test - public void testImplicitSubFlow() { + public void testImplicitSubFlow1() { LiteflowResponse response = flowExecutor.execute2Resp("chain3", "it's a request"); DefaultContext context = response.getFirstContextBean(); Assert.assertTrue(response.isSuccess()); @@ -49,4 +49,17 @@ public class ImplicitSubFlowELSpringbootTest extends BaseTest { //requestData的取值正确 Assert.assertEquals("it's implicit subflow.", context.getData("innerRequest")); } + + //在p里多线程调用q 10次,每个q取到的参数都是不同的。 + @Test + public void testImplicitSubFlow2() { + LiteflowResponse response = flowExecutor.execute2Resp("c1", "it's a request"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + + Set set = context.getData("test"); + + //requestData的取值正确 + Assert.assertEquals(10, set.size()); + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java new file mode 100644 index 000000000..a42802bcf --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java @@ -0,0 +1,32 @@ +package com.yomahub.liteflow.test.subflow.cmp2; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowELSpringbootTest.RUN_TIME_SLOT; + + +@Component("p") +public class PCmp extends NodeComponent { + + @Autowired + private FlowExecutor flowExecutor; + + @Override + public void process() throws Exception { + int slotIndex = this.getSlotIndex(); + for (int i = 0; i < 10; i++) { + int finalI = i; + new Thread(() -> { + try { + flowExecutor.invoke("c2", "it's implicit subflow " + finalI, slotIndex); + } catch (Exception e) { + throw new RuntimeException(e); + } + }).start(); + } + Thread.sleep(1000); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java new file mode 100644 index 000000000..a76c5aea4 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java @@ -0,0 +1,31 @@ +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 java.util.HashSet; +import java.util.Set; + +import static com.yomahub.liteflow.test.subflow.ImplicitSubFlowELSpringbootTest.RUN_TIME_SLOT; + + +@Component("q") +public class QCmp extends NodeComponent { + @Override + public void process() throws Exception { + String requestData = this.getSubChainReqData(); + DefaultContext context = this.getFirstContextBean(); + + synchronized (QCmp.class){ + if (context.hasData("test")){ + Set set = context.getData("test"); + set.add(requestData); + }else{ + Set set = new HashSet<>(); + set.add(requestData); + context.setData("test", set); + } + } + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/flow-implicit.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/flow-implicit.el.xml index 7e885c1c3..91498014a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/flow-implicit.el.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/flow-implicit.el.xml @@ -7,4 +7,12 @@ THEN(h, m); + + + THEN(p); + + + + THEN(q); + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringTest.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringTest.java index 8261fdf8f..f56d2667a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringTest.java @@ -30,7 +30,7 @@ public class ImplicitSubFlowELSpringTest extends BaseTest { //这里GCmp中隐式的调用chain4,从而执行了h,m @Test - public void testImplicitSubFlow() { + public void testImplicitSubFlow1() { LiteflowResponse response = flowExecutor.execute2Resp("chain3", "it's a request"); DefaultContext context = response.getFirstContextBean(); Assert.assertTrue(response.isSuccess()); @@ -43,4 +43,17 @@ public class ImplicitSubFlowELSpringTest extends BaseTest { //requestData的取值正确 Assert.assertEquals("it's implicit subflow.", context.getData("innerRequest")); } + + //在p里多线程调用q 10次,每个q取到的参数都是不同的。 + @Test + public void testImplicitSubFlow2() { + LiteflowResponse response = flowExecutor.execute2Resp("c1", "it's a request"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + + Set set = context.getData("test"); + + //requestData的取值正确 + Assert.assertEquals(10, set.size()); + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java new file mode 100644 index 000000000..492eb375e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/PCmp.java @@ -0,0 +1,30 @@ +package com.yomahub.liteflow.test.subflow.cmp2; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component("p") +public class PCmp extends NodeComponent { + + @Autowired + private FlowExecutor flowExecutor; + + @Override + public void process() throws Exception { + int slotIndex = this.getSlotIndex(); + for (int i = 0; i < 10; i++) { + int finalI = i; + new Thread(() -> { + try { + flowExecutor.invoke("c2", "it's implicit subflow " + finalI, slotIndex); + } catch (Exception e) { + throw new RuntimeException(e); + } + }).start(); + } + Thread.sleep(1000); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java new file mode 100644 index 000000000..f69618efe --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/subflow/cmp2/QCmp.java @@ -0,0 +1,29 @@ +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 java.util.HashSet; +import java.util.Set; + + +@Component("q") +public class QCmp extends NodeComponent { + @Override + public void process() throws Exception { + String requestData = this.getSubChainReqData(); + DefaultContext context = this.getFirstContextBean(); + + synchronized (QCmp.class){ + if (context.hasData("test")){ + Set set = context.getData("test"); + set.add(requestData); + }else{ + Set set = new HashSet<>(); + set.add(requestData); + context.setData("test", set); + } + } + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/subflow/flow-implicit.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/subflow/flow-implicit.el.xml index 25c8d7852..4ba68cecf 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/subflow/flow-implicit.el.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/subflow/flow-implicit.el.xml @@ -7,4 +7,12 @@ THEN(h, m) + + + THEN(p); + + + + THEN(q); + \ No newline at end of file