From 7fdb5829f55b06f48e38092337b10397b416c90d Mon Sep 17 00:00:00 2001 From: luoyi <972849752@qq.com> Date: Wed, 20 Sep 2023 22:55:31 +0800 Subject: [PATCH 1/6] =?UTF-8?q?enhancement=20#I821F1=20=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=97=B6=E5=A2=9E=E5=8A=A0=20Chain=20=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E5=88=A4=E6=96=AD=EF=BC=8C=E9=81=BF=E5=85=8D=E6=AD=BB?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E8=80=8C=E5=AF=BC=E8=87=B4=E5=A0=86=E6=A0=88?= =?UTF-8?q?=E6=BA=A2=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/LiteFlowChainELBuilder.java | 15 +++-- .../yomahub/liteflow/core/FlowExecutor.java | 57 ++++++++++++++++++- .../liteflow/parser/helper/ParserHelper.java | 17 ++++-- ...FlowInDifferentConfigELSpringbootTest.java | 37 ++++++++++++ .../endlessLoop/FlowJsonELSpringBootTest.java | 37 ++++++++++++ .../endlessLoop/FlowXMLELSpringBootTest.java | 37 ++++++++++++ .../endlessLoop/FlowYmlELSpringBootTest.java | 37 ++++++++++++ .../endlessLoop/application-json.properties | 1 + ...plication-subInDifferentConfig1.properties | 2 + .../endlessLoop/application-xml.properties | 1 + .../endlessLoop/application-yml.properties | 1 + .../subflow/endlessLoop/flow-sub1.el.xml | 6 ++ .../subflow/endlessLoop/flow-sub2.el.yml | 6 ++ .../subflow/endlessLoop/flow.el.json | 18 ++++++ .../resources/subflow/endlessLoop/flow.el.xml | 16 ++++++ .../resources/subflow/endlessLoop/flow.el.yml | 8 +++ 16 files changed, 282 insertions(+), 14 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-json.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-subInDifferentConfig1.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-xml.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-yml.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub2.el.yml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.json create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.yml diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java index 97e3de3e5..bb61ce5a4 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java @@ -15,8 +15,8 @@ import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.exception.FlowSystemException; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.element.Chain; -import com.yomahub.liteflow.flow.element.Node; 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; @@ -108,12 +108,15 @@ public class LiteFlowChainELBuilder { return this; } + /** + *

原来逻辑从 FlowBus 中获取相应的 chain,如果 EL 表达式中出现嵌套引用 chain,那么在构建 Condition 的时候可能会出现 chain 死循环引用情况

+ *

故删掉从 FlowBus 中获取的逻辑,直接使用新的 {@link LiteFlowChainELBuilder} 对象。

+ * + * @param chainId + * @return LiteFlowChainELBuilder + */ public LiteFlowChainELBuilder setChainId(String chainId) { - if (FlowBus.containChain(chainId)) { - this.chain = FlowBus.getChain(chainId); - } else { - this.chain.setChainId(chainId); - } + this.chain.setChainId(chainId); return this; } 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 830ad1025..f333a384e 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 @@ -15,9 +15,7 @@ import com.yomahub.liteflow.enums.InnerChainTypeEnum; import com.yomahub.liteflow.exception.*; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.LiteflowResponse; -import com.yomahub.liteflow.flow.element.Chain; -import com.yomahub.liteflow.flow.element.Node; -import com.yomahub.liteflow.flow.element.Rollbackable; +import com.yomahub.liteflow.flow.element.*; import com.yomahub.liteflow.flow.entity.CmpStep; import com.yomahub.liteflow.flow.id.IdGeneratorHolder; import com.yomahub.liteflow.log.LFLog; @@ -195,6 +193,9 @@ public class FlowExecutor { } } + // 检查构建生成的 chain 的有效性 + checkValidOfChain(); + // 执行钩子 if (isStart) { FlowInitHook.executeHook(); @@ -214,6 +215,56 @@ public class FlowExecutor { } } + /** + * 检查 chain 的有效性,同时重新构建 FlowBus 的 chain,将调用的子 chain 连起来 + * @throws CyclicDependencyException + */ + private void checkValidOfChain() { + // 存储已经构建完的有效的 chain 对应 Id + Set validChainIdSet = new HashSet<>(); + // 遍历所有解析的 chain + for (Chain rootChain : FlowBus.getChainMap().values()) { + // 不存在 validChainIdSet 中的 chain,说明还未检查 + if (!validChainIdSet.contains(rootChain.getChainId())) { + // 与 rootChain 相关联的 chain 的 ID + Set associatedChainIdSet = new HashSet<>(); + // 检查 chain 的有效性,是否存在死循环情况 + checkValidOfChain(rootChain, associatedChainIdSet); + // 检查完当前 chain 后,能走到这里说明当前相关的 chain 是有效的 + validChainIdSet.addAll(associatedChainIdSet); + } + } + } + + /** + * 检查 chain 的有效性 + * @param currentChain 当前遍历到的 chain 节点 + * @throws CyclicDependencyException + */ + private void checkValidOfChain(Chain currentChain, Set associatedChainIdSet) { + // 判断 completedChainIdSet 中是否已经存在对应的 chain + if (associatedChainIdSet.add(currentChain.getChainId())) { + // Set 中不存在则说明可能是父 chain 或者子 chain 未引用自身,又或者子 chain 未引用其父 chain,继续判断其子 chain + for (Condition condition : currentChain.getConditionList()) { + // 遍历所有 executable 列表 + for (Executable executable : condition.getExecutableList()) { + // 只需判断 chain,因为只有 chain 才会存在死循环依赖情况 + if (executable instanceof Chain) { + // 能执行到此处,必能从 FlowBus 中获取到对应的 chain,故无需做非空判断 + Chain childrenChain = FlowBus.getChainMap().get(executable.getId()); + // 递归检查 chain 有效性 + checkValidOfChain(childrenChain, associatedChainIdSet); + // 重新构建 chain 的 condition 列表 + ((Chain) executable).setConditionList(childrenChain.getConditionList()); + } + } + } + } else { + // chain 重复,说明子 chain 中引用了自身或其父 chain,存在死循环情况 + throw new CyclicDependencyException(StrUtil.format("There is a circular dependency in the chain[{}], please check carefully.", currentChain.getChainId())); + } + } + // 此方法就是从原有的配置源主动拉取新的进行刷新 // 和FlowBus.refreshFlowMetaData的区别就是一个为主动拉取,一个为被动监听到新的内容进行刷新 public void reloadRule() { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java index eb239f76f..89eb4177b 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java @@ -13,7 +13,10 @@ import com.yomahub.liteflow.flow.FlowBus; import org.dom4j.Document; import org.dom4j.Element; -import java.util.*; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import java.util.Set; import java.util.function.Consumer; import java.util.regex.Pattern; @@ -237,8 +240,10 @@ public class ParserHelper { // 构建chainBuilder String chainId = Optional.ofNullable(chainNode.get(ID)).orElse(chainNode.get(NAME)).textValue(); String el = chainNode.get(VALUE).textValue(); - LiteFlowChainELBuilder chainELBuilder = LiteFlowChainELBuilder.createChain().setChainId(chainId); - chainELBuilder.setEL(el).build(); + LiteFlowChainELBuilder.createChain() + .setChainId(chainId) + .setEL(el) + .build(); } /** @@ -250,8 +255,10 @@ public class ParserHelper { String chainId = Optional.ofNullable(e.attributeValue(ID)).orElse(e.attributeValue(NAME)); String text = e.getText(); String el = RegexUtil.removeComments(text); - LiteFlowChainELBuilder chainELBuilder = LiteFlowChainELBuilder.createChain().setChainId(chainId); - chainELBuilder.setEL(el).build(); + LiteFlowChainELBuilder.createChain() + .setChainId(chainId) + .setEL(el) + .build(); } /** diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java new file mode 100644 index 000000000..331297ab3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java @@ -0,0 +1,37 @@ +package com.yomahub.liteflow.test.subflow.endlessLoop; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +/** + * 测试多文件情况下 chain 死循环逻辑 + * + * @author luo yi + * @since 2.11.0 + */ +@TestPropertySource(value = "classpath:/subflow/endlessLoop/application-subInDifferentConfig1.properties") +@SpringBootTest(classes = FlowInDifferentConfigELSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.subflow.cmp1", "com.yomahub.liteflow.test.subflow.cmp2" }) +public class FlowInDifferentConfigELSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 测试 chain 死循环 + @Test + public void testChainEndlessLoop() { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "it's a request"); + Assertions.assertFalse(response.isSuccess()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java new file mode 100644 index 000000000..3a9a01a53 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java @@ -0,0 +1,37 @@ +package com.yomahub.liteflow.test.subflow.endlessLoop; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +/** + * 测试 json 文件情况下 chain 死循环逻辑 + * + * @author luo yi + * @since 2.11.0 + */ +@TestPropertySource(value = "classpath:/subflow/endlessLoop/application-json.properties") +@SpringBootTest(classes = FlowJsonELSpringBootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.subflow.cmp1" }) +public class FlowJsonELSpringBootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 测试 chain 死循环 + @Test + public void testChainEndlessLoop() { + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "it's a request"); + Assertions.assertFalse(response.isSuccess()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java new file mode 100644 index 000000000..f686e4150 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java @@ -0,0 +1,37 @@ +package com.yomahub.liteflow.test.subflow.endlessLoop; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +/** + * 测试 xml 文件情况下 chain 死循环逻辑 + * + * @author luo yi + * @since 2.11.0 + */ +@TestPropertySource(value = "classpath:/subflow/endlessLoop/application-xml.properties") +@SpringBootTest(classes = FlowXMLELSpringBootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.subflow.cmp1" }) +public class FlowXMLELSpringBootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 测试 chain 死循环 + @Test + public void testChainEndlessLoop() { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "it's a request"); + Assertions.assertFalse(response.isSuccess()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java new file mode 100644 index 000000000..b0829cb26 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java @@ -0,0 +1,37 @@ +package com.yomahub.liteflow.test.subflow.endlessLoop; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +/** + * 测试 yml 文件情况下 chain 死循环逻辑 + * + * @author luo yi + * @since 2.11.0 + */ +@TestPropertySource(value = "classpath:/subflow/endlessLoop/application-yml.properties") +@SpringBootTest(classes = FlowYmlELSpringBootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.subflow.cmp1" }) +public class FlowYmlELSpringBootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 测试 chain 死循环 + @Test + public void testChainEndlessLoop() { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "it's a request"); + Assertions.assertFalse(response.isSuccess()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-json.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-json.properties new file mode 100644 index 000000000..f19fd93f5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-json.properties @@ -0,0 +1 @@ +liteflow.rule-source=subflow/endlessLoop/flow.el.json \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-subInDifferentConfig1.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-subInDifferentConfig1.properties new file mode 100644 index 000000000..418d38274 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-subInDifferentConfig1.properties @@ -0,0 +1,2 @@ +liteflow.rule-source=subflow/endlessLoop/flow-sub1.el.xml,subflow/endlessLoop/flow-sub2.el.yml +liteflow.support-multiple-type=true \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-xml.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-xml.properties new file mode 100644 index 000000000..d2261bca5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-xml.properties @@ -0,0 +1 @@ +liteflow.rule-source=subflow/endlessLoop/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-yml.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-yml.properties new file mode 100644 index 000000000..a9088ce2e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-yml.properties @@ -0,0 +1 @@ +liteflow.rule-source=subflow/endlessLoop/flow.el.yml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml new file mode 100644 index 000000000..3f1a585ab --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml @@ -0,0 +1,6 @@ + + + + THEN(a, b); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub2.el.yml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub2.el.yml new file mode 100644 index 000000000..6861be3cc --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub2.el.yml @@ -0,0 +1,6 @@ +flow: + chain: + - name: chain2 + value: "THEN(c, d, chain3);" + - name: chain3 + value: "THEN(a, chain2);" \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.json b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.json new file mode 100644 index 000000000..1a54d6c6c --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.json @@ -0,0 +1,18 @@ +{ + "flow": { + "chain": [ + { + "name": "chain7", + "value": "THEN(a, chain8);" + }, + { + "name": "chain8", + "value": "THEN(b, chain9);" + }, + { + "name": "chain9", + "value": "WHEN(c, chain7);" + } + ] + } +} \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.xml new file mode 100644 index 000000000..d615bf81d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.xml @@ -0,0 +1,16 @@ + + + + + THEN(a, chain2); + + + + THEN(b, chain3); + + + + THEN(c, chain1); + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.yml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.yml new file mode 100644 index 000000000..1699d501b --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.yml @@ -0,0 +1,8 @@ +flow: + chain: + - name: chain4 + value: "THEN(a, chain5);" + - name: chain5 + value: "THEN(b, chain6);" + - name: chain6 + value: "THEN(c, chain5);" \ No newline at end of file From ca9449f531036fb572284dd1e1820e077e931759 Mon Sep 17 00:00:00 2001 From: luoyi <972849752@qq.com> Date: Fri, 22 Sep 2023 23:38:58 +0800 Subject: [PATCH 2/6] =?UTF-8?q?enhancement=20#I821F1=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yomahub/liteflow/core/FlowExecutor.java | 30 +++++++++- .../FlowInDifferentConfigTest.java | 31 ++++++++++ .../subflow/endlessLopp/FlowJsonTest.java | 29 ++++++++++ .../test/subflow/endlessLopp/FlowXMLTest.java | 29 ++++++++++ .../test/subflow/endlessLopp/FlowYMLTest.java | 29 ++++++++++ .../subflow/endlessLoop/flow-main.el.xml | 17 ++++++ .../subflow/endlessLoop/flow-sub1.el.xml | 6 ++ .../subflow/endlessLoop/flow.el.json | 58 +++++++++++++++++++ .../resources/subflow/endlessLoop/flow.el.xml | 25 ++++++++ .../resources/subflow/endlessLoop/flow.el.yml | 28 +++++++++ 10 files changed, 279 insertions(+), 3 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowInDifferentConfigTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowJsonTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowXMLTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowYMLTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-main.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.json create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.yml 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 f333a384e..fea85b472 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 @@ -216,53 +216,77 @@ public class FlowExecutor { } /** - * 检查 chain 的有效性,同时重新构建 FlowBus 的 chain,将调用的子 chain 连起来 + * 检查 chain 的有效性,同时重新构建 FlowBus 的 chain,将其子 chain 引用连起来 * @throws CyclicDependencyException */ private void checkValidOfChain() { + // 存储已经构建完的有效的 chain 对应 Id Set validChainIdSet = new HashSet<>(); + // 遍历所有解析的 chain for (Chain rootChain : FlowBus.getChainMap().values()) { + // 不存在 validChainIdSet 中的 chain,说明还未检查 if (!validChainIdSet.contains(rootChain.getChainId())) { + // 与 rootChain 相关联的 chain 的 ID Set associatedChainIdSet = new HashSet<>(); + // 检查 chain 的有效性,是否存在死循环情况 checkValidOfChain(rootChain, associatedChainIdSet); + // 检查完当前 chain 后,能走到这里说明当前相关的 chain 是有效的 validChainIdSet.addAll(associatedChainIdSet); + } } + } /** * 检查 chain 的有效性 * @param currentChain 当前遍历到的 chain 节点 + * @param associatedChainIdSet 与 rootChain 相关联的 chainId 集合 * @throws CyclicDependencyException */ private void checkValidOfChain(Chain currentChain, Set associatedChainIdSet) { - // 判断 completedChainIdSet 中是否已经存在对应的 chain + + // 判断 associatedChainIdSet 中是否已经存在对应的 chain if (associatedChainIdSet.add(currentChain.getChainId())) { + // Set 中不存在则说明可能是父 chain 或者子 chain 未引用自身,又或者子 chain 未引用其父 chain,继续判断其子 chain for (Condition condition : currentChain.getConditionList()) { + // 遍历所有 executable 列表 for (Executable executable : condition.getExecutableList()) { + // 只需判断 chain,因为只有 chain 才会存在死循环依赖情况 if (executable instanceof Chain) { + // 能执行到此处,必能从 FlowBus 中获取到对应的 chain,故无需做非空判断 Chain childrenChain = FlowBus.getChainMap().get(executable.getId()); + // 递归检查 chain 有效性 checkValidOfChain(childrenChain, associatedChainIdSet); + // 重新构建 chain 的 condition 列表 ((Chain) executable).setConditionList(childrenChain.getConditionList()); + } } } } else { + + String errorMessage = StrUtil.format("There is a circular dependency in the chain[{}], please check carefully.", currentChain.getChainId()); + + LOG.error(errorMessage); + // chain 重复,说明子 chain 中引用了自身或其父 chain,存在死循环情况 - throw new CyclicDependencyException(StrUtil.format("There is a circular dependency in the chain[{}], please check carefully.", currentChain.getChainId())); + throw new CyclicDependencyException(errorMessage); + } + } // 此方法就是从原有的配置源主动拉取新的进行刷新 diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowInDifferentConfigTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowInDifferentConfigTest.java new file mode 100644 index 000000000..24d21cc48 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowInDifferentConfigTest.java @@ -0,0 +1,31 @@ + +package com.yomahub.liteflow.test.subflow.endlessLopp; + +import com.yomahub.liteflow.core.FlowExecutorHolder; +import com.yomahub.liteflow.exception.CyclicDependencyException; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + + +/** + * 测试多文件情况下 chain 死循环逻辑 + * + * @author luo yi + * @since 2.11.1 + */ +public class FlowInDifferentConfigTest extends BaseTest { + + // 测试 chain 死循环 + @Test + public void testChainEndlessLoop() { + Assertions.assertThrows(CyclicDependencyException.class, () -> { + LiteflowConfig config = LiteflowConfigGetter.get(); + config.setRuleSource("subflow/endlessLoop/flow-main.el.xml,subflow/endlessLoop/flow-sub1.el.xml"); + FlowExecutorHolder.loadInstance(config); + }); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowJsonTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowJsonTest.java new file mode 100644 index 000000000..12b6f8c42 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowJsonTest.java @@ -0,0 +1,29 @@ +package com.yomahub.liteflow.test.subflow.endlessLopp; + +import com.yomahub.liteflow.core.FlowExecutorHolder; +import com.yomahub.liteflow.exception.CyclicDependencyException; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * 测试 json 文件情况下 chain 死循环逻辑 + * + * @author luo yi + * @since 2.11.1 + */ +public class FlowJsonTest extends BaseTest { + + // 测试 chain 死循环 + @Test + public void testChainEndlessLoop() { + Assertions.assertThrows(CyclicDependencyException.class, () -> { + LiteflowConfig config = LiteflowConfigGetter.get(); + config.setRuleSource("subflow/endlessLoop/flow.el.json"); + FlowExecutorHolder.loadInstance(config); + }); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowXMLTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowXMLTest.java new file mode 100644 index 000000000..465c4b4f2 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowXMLTest.java @@ -0,0 +1,29 @@ +package com.yomahub.liteflow.test.subflow.endlessLopp; + +import com.yomahub.liteflow.core.FlowExecutorHolder; +import com.yomahub.liteflow.exception.CyclicDependencyException; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * 测试 xml 文件情况下 chain 死循环逻辑 + * + * @author luo yi + * @since 2.11.1 + */ +public class FlowXMLTest extends BaseTest { + + // 测试 chain 死循环 + @Test + public void testChainEndlessLoop() { + Assertions.assertThrows(CyclicDependencyException.class, () -> { + LiteflowConfig config = LiteflowConfigGetter.get(); + config.setRuleSource("subflow/endlessLoop/flow.el.xml"); + FlowExecutorHolder.loadInstance(config); + }); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowYMLTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowYMLTest.java new file mode 100644 index 000000000..e586b7d8e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowYMLTest.java @@ -0,0 +1,29 @@ +package com.yomahub.liteflow.test.subflow.endlessLopp; + +import com.yomahub.liteflow.core.FlowExecutorHolder; +import com.yomahub.liteflow.exception.CyclicDependencyException; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * 测试 yml 文件情况下 chain 死循环逻辑 + * + * @author luo yi + * @since 2.11.1 + */ +public class FlowYMLTest extends BaseTest { + + // 测试 chain 死循环 + @Test + public void testChainEndlessLoop() { + Assertions.assertThrows(CyclicDependencyException.class, () -> { + LiteflowConfig config = LiteflowConfigGetter.get(); + config.setRuleSource("subflow/endlessLoop/flow.el.yml"); + FlowExecutorHolder.loadInstance(config); + }); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-main.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-main.el.xml new file mode 100644 index 000000000..4f479f6e5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-main.el.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + THEN(a, b, chain2); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml new file mode 100644 index 000000000..39b89324e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml @@ -0,0 +1,6 @@ + + + + THEN(b, a, chain1); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.json b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.json new file mode 100644 index 000000000..e1012cc73 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.json @@ -0,0 +1,58 @@ +{ + "flow": { + "nodes": { + "node": [ + { + "id": "a", + "class": "com.yomahub.liteflow.test.subflow.cmp1.ACmp" + }, + { + "id": "b", + "class": "com.yomahub.liteflow.test.subflow.cmp1.BCmp" + }, + { + "id": "c", + "class": "com.yomahub.liteflow.test.subflow.cmp1.CCmp" + }, + { + "id": "d", + "class": "com.yomahub.liteflow.test.subflow.cmp1.DCmp" + }, + { + "id": "e", + "class": "com.yomahub.liteflow.test.subflow.cmp1.ECmp" + }, + { + "id": "f", + "class": "com.yomahub.liteflow.test.subflow.cmp2.FCmp" + }, + { + "id": "g", + "class": "com.yomahub.liteflow.test.subflow.cmp2.GCmp" + }, + { + "id": "h", + "class": "com.yomahub.liteflow.test.subflow.cmp2.HCmp" + }, + { + "id": "M", + "class": "com.yomahub.liteflow.test.subflow.cmp2.MCmp" + } + ] + }, + "chain": [ + { + "name": "chain7", + "value": "THEN(a, chain8);" + }, + { + "name": "chain8", + "value": "THEN(b, chain9);" + }, + { + "name": "chain9", + "value": "WHEN(c, chain7);" + } + ] + } +} \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.xml new file mode 100644 index 000000000..38120c94f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + THEN(a, chain2); + + + + THEN(b, chain3); + + + + THEN(c, chain1); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.yml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.yml new file mode 100644 index 000000000..efdf7b431 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.yml @@ -0,0 +1,28 @@ +flow: + nodes: + node: + - id: a + class: com.yomahub.liteflow.test.subflow.cmp1.ACmp + - id: b + class: com.yomahub.liteflow.test.subflow.cmp1.BCmp + - id: c + class: com.yomahub.liteflow.test.subflow.cmp1.CCmp + - id: d + class: com.yomahub.liteflow.test.subflow.cmp1.DCmp + - id: e + class: com.yomahub.liteflow.test.subflow.cmp1.ECmp + - id: f + class: com.yomahub.liteflow.test.subflow.cmp2.FCmp + - id: g + class: com.yomahub.liteflow.test.subflow.cmp2.GCmp + - id: h + class: com.yomahub.liteflow.test.subflow.cmp2.HCmp + - id: h + class: com.yomahub.liteflow.test.subflow.cmp2.MCmp + chain: + - name: chain4 + value: "THEN(a, chain5);" + - name: chain5 + value: "THEN(b, chain6);" + - name: chain6 + value: "THEN(c, chain5);" \ No newline at end of file From 570b95c84fddcda7546c6eb114eae7df232a881f Mon Sep 17 00:00:00 2001 From: luoyi <972849752@qq.com> Date: Fri, 22 Sep 2023 23:40:41 +0800 Subject: [PATCH 3/6] =?UTF-8?q?enhancement=20#I821F1=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../endlessLoop/FlowInDifferentConfigELSpringbootTest.java | 2 +- .../test/subflow/endlessLoop/FlowJsonELSpringBootTest.java | 2 +- .../test/subflow/endlessLoop/FlowXMLELSpringBootTest.java | 2 +- .../test/subflow/endlessLoop/FlowYmlELSpringBootTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java index 331297ab3..ca5ea0fed 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java @@ -16,7 +16,7 @@ import javax.annotation.Resource; * 测试多文件情况下 chain 死循环逻辑 * * @author luo yi - * @since 2.11.0 + * @since 2.11.1 */ @TestPropertySource(value = "classpath:/subflow/endlessLoop/application-subInDifferentConfig1.properties") @SpringBootTest(classes = FlowInDifferentConfigELSpringbootTest.class) diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java index 3a9a01a53..b0d97aa1b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java @@ -16,7 +16,7 @@ import javax.annotation.Resource; * 测试 json 文件情况下 chain 死循环逻辑 * * @author luo yi - * @since 2.11.0 + * @since 2.11.1 */ @TestPropertySource(value = "classpath:/subflow/endlessLoop/application-json.properties") @SpringBootTest(classes = FlowJsonELSpringBootTest.class) diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java index f686e4150..6543f63d3 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java @@ -16,7 +16,7 @@ import javax.annotation.Resource; * 测试 xml 文件情况下 chain 死循环逻辑 * * @author luo yi - * @since 2.11.0 + * @since 2.11.1 */ @TestPropertySource(value = "classpath:/subflow/endlessLoop/application-xml.properties") @SpringBootTest(classes = FlowXMLELSpringBootTest.class) diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java index b0829cb26..f9a6d8f75 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java @@ -16,7 +16,7 @@ import javax.annotation.Resource; * 测试 yml 文件情况下 chain 死循环逻辑 * * @author luo yi - * @since 2.11.0 + * @since 2.11.1 */ @TestPropertySource(value = "classpath:/subflow/endlessLoop/application-yml.properties") @SpringBootTest(classes = FlowYmlELSpringBootTest.class) From f64b97c7a2cfc930846ec605cca6ed386da13e16 Mon Sep 17 00:00:00 2001 From: luoyi <972849752@qq.com> Date: Wed, 27 Sep 2023 20:40:29 +0800 Subject: [PATCH 4/6] =?UTF-8?q?enhancement=20#I821F1=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20Jackson=20=E5=BA=8F=E5=88=97=E5=8C=96=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=20chain=20=E6=98=AF=E5=90=A6=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E5=BE=AA=E7=8E=AF=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/LiteFlowChainELBuilder.java | 32 +++++--- .../yomahub/liteflow/core/FlowExecutor.java | 81 +------------------ .../yomahub/liteflow/flow/element/Node.java | 15 ++-- 3 files changed, 32 insertions(+), 96 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java index 9473efb81..616988d77 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java @@ -4,15 +4,15 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.ql.util.express.DefaultContext; import com.ql.util.express.ExpressRunner; import com.ql.util.express.InstructionSet; import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.builder.el.operator.*; import com.yomahub.liteflow.common.ChainConstant; -import com.yomahub.liteflow.exception.DataNotFoundException; -import com.yomahub.liteflow.exception.ELParseException; -import com.yomahub.liteflow.exception.FlowSystemException; +import com.yomahub.liteflow.exception.*; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.element.Chain; import com.yomahub.liteflow.flow.element.Condition; @@ -34,6 +34,8 @@ public class LiteFlowChainELBuilder { private static final LFLog LOG = LFLoggerManager.getLogger(LiteFlowChainELBuilder.class); + private static ObjectMapper objectMapper =new ObjectMapper(); + private Chain chain; /** @@ -109,15 +111,12 @@ public class LiteFlowChainELBuilder { return this; } - /** - *

原来逻辑从 FlowBus 中获取相应的 chain,如果 EL 表达式中出现嵌套引用 chain,那么在构建 Condition 的时候可能会出现 chain 死循环引用情况

- *

故删掉从 FlowBus 中获取的逻辑,直接使用新的 {@link LiteFlowChainELBuilder} 对象。

- * - * @param chainId - * @return LiteFlowChainELBuilder - */ public LiteFlowChainELBuilder setChainId(String chainId) { - this.chain.setChainId(chainId); + if (FlowBus.containChain(chainId)) { + this.chain = FlowBus.getChain(chainId); + } else { + this.chain.setChainId(chainId); + } return this; } @@ -199,6 +198,17 @@ public class LiteFlowChainELBuilder { if (CollUtil.isNotEmpty(errorList)) { throw new RuntimeException(CollUtil.join(errorList, ",", "[", "]")); } + // 对每一个 chain 进行循环引用检测 + try { + objectMapper.writeValueAsString(this.chain); + } catch (Exception e) { + e.printStackTrace(); + if (e instanceof JsonMappingException) { + throw new CyclicDependencyException(StrUtil.format("There is a circular dependency in the chain[{}], please check carefully.", chain.getChainId())); + } else { + throw new ParseException(e.getMessage()); + } + } } /** 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 fea85b472..830ad1025 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 @@ -15,7 +15,9 @@ import com.yomahub.liteflow.enums.InnerChainTypeEnum; import com.yomahub.liteflow.exception.*; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.LiteflowResponse; -import com.yomahub.liteflow.flow.element.*; +import com.yomahub.liteflow.flow.element.Chain; +import com.yomahub.liteflow.flow.element.Node; +import com.yomahub.liteflow.flow.element.Rollbackable; import com.yomahub.liteflow.flow.entity.CmpStep; import com.yomahub.liteflow.flow.id.IdGeneratorHolder; import com.yomahub.liteflow.log.LFLog; @@ -193,9 +195,6 @@ public class FlowExecutor { } } - // 检查构建生成的 chain 的有效性 - checkValidOfChain(); - // 执行钩子 if (isStart) { FlowInitHook.executeHook(); @@ -215,80 +214,6 @@ public class FlowExecutor { } } - /** - * 检查 chain 的有效性,同时重新构建 FlowBus 的 chain,将其子 chain 引用连起来 - * @throws CyclicDependencyException - */ - private void checkValidOfChain() { - - // 存储已经构建完的有效的 chain 对应 Id - Set validChainIdSet = new HashSet<>(); - - // 遍历所有解析的 chain - for (Chain rootChain : FlowBus.getChainMap().values()) { - - // 不存在 validChainIdSet 中的 chain,说明还未检查 - if (!validChainIdSet.contains(rootChain.getChainId())) { - - // 与 rootChain 相关联的 chain 的 ID - Set associatedChainIdSet = new HashSet<>(); - - // 检查 chain 的有效性,是否存在死循环情况 - checkValidOfChain(rootChain, associatedChainIdSet); - - // 检查完当前 chain 后,能走到这里说明当前相关的 chain 是有效的 - validChainIdSet.addAll(associatedChainIdSet); - - } - } - - } - - /** - * 检查 chain 的有效性 - * @param currentChain 当前遍历到的 chain 节点 - * @param associatedChainIdSet 与 rootChain 相关联的 chainId 集合 - * @throws CyclicDependencyException - */ - private void checkValidOfChain(Chain currentChain, Set associatedChainIdSet) { - - // 判断 associatedChainIdSet 中是否已经存在对应的 chain - if (associatedChainIdSet.add(currentChain.getChainId())) { - - // Set 中不存在则说明可能是父 chain 或者子 chain 未引用自身,又或者子 chain 未引用其父 chain,继续判断其子 chain - for (Condition condition : currentChain.getConditionList()) { - - // 遍历所有 executable 列表 - for (Executable executable : condition.getExecutableList()) { - - // 只需判断 chain,因为只有 chain 才会存在死循环依赖情况 - if (executable instanceof Chain) { - - // 能执行到此处,必能从 FlowBus 中获取到对应的 chain,故无需做非空判断 - Chain childrenChain = FlowBus.getChainMap().get(executable.getId()); - - // 递归检查 chain 有效性 - checkValidOfChain(childrenChain, associatedChainIdSet); - - // 重新构建 chain 的 condition 列表 - ((Chain) executable).setConditionList(childrenChain.getConditionList()); - - } - } - } - } else { - - String errorMessage = StrUtil.format("There is a circular dependency in the chain[{}], please check carefully.", currentChain.getChainId()); - - LOG.error(errorMessage); - - // chain 重复,说明子 chain 中引用了自身或其父 chain,存在死循环情况 - throw new CyclicDependencyException(errorMessage); - - } - - } - // 此方法就是从原有的配置源主动拉取新的进行刷新 // 和FlowBus.refreshFlowMetaData的区别就是一个为主动拉取,一个为被动监听到新的内容进行刷新 public void reloadRule() { 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 5d90e3c16..59a4674d5 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 @@ -8,23 +8,23 @@ package com.yomahub.liteflow.flow.element; -import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.ttl.TransmittableThreadLocal; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.ExecuteTypeEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import com.yomahub.liteflow.exception.ChainEndException; +import com.yomahub.liteflow.exception.FlowSystemException; +import com.yomahub.liteflow.flow.executor.NodeExecutor; +import com.yomahub.liteflow.flow.executor.NodeExecutorHelper; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.property.LiteflowConfig; import com.yomahub.liteflow.property.LiteflowConfigGetter; import com.yomahub.liteflow.slot.DataBus; import com.yomahub.liteflow.slot.Slot; -import com.yomahub.liteflow.flow.executor.NodeExecutor; -import com.yomahub.liteflow.flow.executor.NodeExecutorHelper; -import com.yomahub.liteflow.enums.ExecuteTypeEnum; -import com.yomahub.liteflow.enums.NodeTypeEnum; -import com.yomahub.liteflow.exception.ChainEndException; -import com.yomahub.liteflow.exception.FlowSystemException; /** * Node节点,实现可执行器 Node节点并不是单例的,每构建一次都会copy出一个新的实例 @@ -47,6 +47,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ private String language; + @JsonIgnore private NodeComponent instance; private String tag; From 5785c59b95fb4d73dee71cd083d13db2f695a8a3 Mon Sep 17 00:00:00 2001 From: luoyi <972849752@qq.com> Date: Wed, 27 Sep 2023 20:57:53 +0800 Subject: [PATCH 5/6] =?UTF-8?q?enhancement=20#I821F1=20=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java | 3 +-- .../src/main/java/com/yomahub/liteflow/flow/element/Node.java | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java index 616988d77..cb6fd7748 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java @@ -202,9 +202,8 @@ public class LiteFlowChainELBuilder { try { objectMapper.writeValueAsString(this.chain); } catch (Exception e) { - e.printStackTrace(); if (e instanceof JsonMappingException) { - throw new CyclicDependencyException(StrUtil.format("There is a circular dependency in the chain[{}], please check carefully.", chain.getChainId())); + throw new CyclicDependencyException(StrUtil.format("There is a circular dependency in the chain[{}], please check carefully.", chain.getChainId(), e)); } else { throw new ParseException(e.getMessage()); } 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 59a4674d5..269a4dd62 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 @@ -47,6 +47,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ private String language; + // 增加该注解,避免在使用 Jackson 序列化检测循环引用时出现不必要异常 @JsonIgnore private NodeComponent instance; From a7ffee862e0056de9f1c00b91eccbd637eeaf97e Mon Sep 17 00:00:00 2001 From: luoyi <972849752@qq.com> Date: Mon, 2 Oct 2023 17:20:24 +0800 Subject: [PATCH 6/6] =?UTF-8?q?enhancement=20#I821F1=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=20Chain=20=E5=BE=AA=E7=8E=AF=E4=BE=9D=E8=B5=96=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FlowInDifferentConfigTest.java | 4 +- .../FlowJsonTest.java | 4 +- .../FlowXMLTest.java | 4 +- .../FlowYMLTest.java | 4 +- .../liteflow/test/endlessLoop/cmp/ACmp.java | 12 ++++ .../liteflow/test/endlessLoop/cmp/BCmp.java | 12 ++++ .../liteflow/test/endlessLoop/cmp/CCmp.java | 12 ++++ .../liteflow/test/endlessLoop/cmp/DCmp.java | 12 ++++ .../liteflow/test/endlessLoop/cmp/ECmp.java | 12 ++++ .../resources/endlessLoop/flow-main.el.xml | 13 +++++ .../endlessLoop/flow-sub1.el.xml | 0 .../test/resources/endlessLoop/flow.el.json | 42 ++++++++++++++ .../test/resources/endlessLoop/flow.el.xml | 21 +++++++ .../test/resources/endlessLoop/flow.el.yml | 20 +++++++ .../subflow/endlessLoop/flow-main.el.xml | 17 ------ .../subflow/endlessLoop/flow.el.json | 58 ------------------- .../resources/subflow/endlessLoop/flow.el.xml | 25 -------- .../resources/subflow/endlessLoop/flow.el.yml | 28 --------- ...FlowInDifferentConfigELSpringbootTest.java | 18 +++--- .../endlessLoop/FlowJsonELSpringBootTest.java | 17 +++--- .../endlessLoop/FlowXMLELSpringBootTest.java | 17 +++--- .../endlessLoop/FlowYmlELSpringBootTest.java | 17 +++--- .../liteflow/test/endlessLoop/cmp/ACmp.java | 14 +++++ .../liteflow/test/endlessLoop/cmp/BCmp.java | 14 +++++ .../liteflow/test/endlessLoop/cmp/CCmp.java | 14 +++++ .../liteflow/test/endlessLoop/cmp/DCmp.java | 14 +++++ .../liteflow/test/endlessLoop/cmp/ECmp.java | 14 +++++ .../endlessLoop/flow-sub1.el.xml | 0 .../endlessLoop/flow-sub2.el.yml | 0 .../{subflow => }/endlessLoop/flow.el.json | 0 .../{subflow => }/endlessLoop/flow.el.xml | 0 .../{subflow => }/endlessLoop/flow.el.yml | 0 .../endlessLoop/application-json.properties | 1 - ...plication-subInDifferentConfig1.properties | 2 - .../endlessLoop/application-xml.properties | 1 - .../endlessLoop/application-yml.properties | 1 - 36 files changed, 275 insertions(+), 169 deletions(-) rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{subflow/endlessLopp => endlessLoop}/FlowInDifferentConfigTest.java (82%) rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{subflow/endlessLopp => endlessLoop}/FlowJsonTest.java (86%) rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{subflow/endlessLopp => endlessLoop}/FlowXMLTest.java (86%) rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{subflow/endlessLopp => endlessLoop}/FlowYMLTest.java (86%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/CCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/DCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ECmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow-main.el.xml rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/{subflow => }/endlessLoop/flow-sub1.el.xml (100%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.json create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.yml delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-main.el.xml delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.json delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.xml delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.yml rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/{subflow => }/endlessLoop/FlowInDifferentConfigELSpringbootTest.java (57%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/{subflow => }/endlessLoop/FlowJsonELSpringBootTest.java (60%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/{subflow => }/endlessLoop/FlowXMLELSpringBootTest.java (60%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/{subflow => }/endlessLoop/FlowYmlELSpringBootTest.java (60%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/CCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/DCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ECmp.java rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/{subflow => }/endlessLoop/flow-sub1.el.xml (100%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/{subflow => }/endlessLoop/flow-sub2.el.yml (100%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/{subflow => }/endlessLoop/flow.el.json (100%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/{subflow => }/endlessLoop/flow.el.xml (100%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/{subflow => }/endlessLoop/flow.el.yml (100%) delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-json.properties delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-subInDifferentConfig1.properties delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-xml.properties delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-yml.properties diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowInDifferentConfigTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowInDifferentConfigTest.java similarity index 82% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowInDifferentConfigTest.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowInDifferentConfigTest.java index 24d21cc48..3017205c4 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowInDifferentConfigTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowInDifferentConfigTest.java @@ -1,5 +1,5 @@ -package com.yomahub.liteflow.test.subflow.endlessLopp; +package com.yomahub.liteflow.test.endlessLoop; import com.yomahub.liteflow.core.FlowExecutorHolder; import com.yomahub.liteflow.exception.CyclicDependencyException; @@ -23,7 +23,7 @@ public class FlowInDifferentConfigTest extends BaseTest { public void testChainEndlessLoop() { Assertions.assertThrows(CyclicDependencyException.class, () -> { LiteflowConfig config = LiteflowConfigGetter.get(); - config.setRuleSource("subflow/endlessLoop/flow-main.el.xml,subflow/endlessLoop/flow-sub1.el.xml"); + config.setRuleSource("endlessLoop/flow-main.el.xml,endlessLoop/flow-sub1.el.xml"); FlowExecutorHolder.loadInstance(config); }); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowJsonTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowJsonTest.java similarity index 86% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowJsonTest.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowJsonTest.java index 12b6f8c42..5f36f22aa 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowJsonTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowJsonTest.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.subflow.endlessLopp; +package com.yomahub.liteflow.test.endlessLoop; import com.yomahub.liteflow.core.FlowExecutorHolder; import com.yomahub.liteflow.exception.CyclicDependencyException; @@ -21,7 +21,7 @@ public class FlowJsonTest extends BaseTest { public void testChainEndlessLoop() { Assertions.assertThrows(CyclicDependencyException.class, () -> { LiteflowConfig config = LiteflowConfigGetter.get(); - config.setRuleSource("subflow/endlessLoop/flow.el.json"); + config.setRuleSource("endlessLoop/flow.el.json"); FlowExecutorHolder.loadInstance(config); }); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowXMLTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowXMLTest.java similarity index 86% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowXMLTest.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowXMLTest.java index 465c4b4f2..3091e60a9 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowXMLTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowXMLTest.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.subflow.endlessLopp; +package com.yomahub.liteflow.test.endlessLoop; import com.yomahub.liteflow.core.FlowExecutorHolder; import com.yomahub.liteflow.exception.CyclicDependencyException; @@ -21,7 +21,7 @@ public class FlowXMLTest extends BaseTest { public void testChainEndlessLoop() { Assertions.assertThrows(CyclicDependencyException.class, () -> { LiteflowConfig config = LiteflowConfigGetter.get(); - config.setRuleSource("subflow/endlessLoop/flow.el.xml"); + config.setRuleSource("endlessLoop/flow.el.xml"); FlowExecutorHolder.loadInstance(config); }); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowYMLTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowYMLTest.java similarity index 86% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowYMLTest.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowYMLTest.java index e586b7d8e..654cf63db 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/subflow/endlessLopp/FlowYMLTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowYMLTest.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.subflow.endlessLopp; +package com.yomahub.liteflow.test.endlessLoop; import com.yomahub.liteflow.core.FlowExecutorHolder; import com.yomahub.liteflow.exception.CyclicDependencyException; @@ -21,7 +21,7 @@ public class FlowYMLTest extends BaseTest { public void testChainEndlessLoop() { Assertions.assertThrows(CyclicDependencyException.class, () -> { LiteflowConfig config = LiteflowConfigGetter.get(); - config.setRuleSource("subflow/endlessLoop/flow.el.yml"); + config.setRuleSource("endlessLoop/flow.el.yml"); FlowExecutorHolder.loadInstance(config); }); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ACmp.java new file mode 100644 index 000000000..a98b541c2 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ACmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.endlessLoop.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class ACmp extends NodeComponent { + + @Override + public void process() { + System.out.println("Acomp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/BCmp.java new file mode 100644 index 000000000..f3699371e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/BCmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.endlessLoop.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class BCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("Bcomp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/CCmp.java new file mode 100644 index 000000000..d9abde6be --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/CCmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.endlessLoop.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class CCmp extends NodeComponent { + + @Override + public void process() throws Exception { + System.out.println("Ccomp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/DCmp.java new file mode 100644 index 000000000..b5ffafe78 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/DCmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.endlessLoop.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class DCmp extends NodeComponent { + + @Override + public void process() throws Exception { + System.out.println("Dcomp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ECmp.java new file mode 100644 index 000000000..fce4af378 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ECmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.endlessLoop.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class ECmp extends NodeComponent { + + @Override + public void process() throws Exception { + System.out.println("Ecomp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow-main.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow-main.el.xml new file mode 100644 index 000000000..2100fc65f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow-main.el.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + THEN(a, b, chain2); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow-sub1.el.xml similarity index 100% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow-sub1.el.xml diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.json b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.json new file mode 100644 index 000000000..b63faed4d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.json @@ -0,0 +1,42 @@ +{ + "flow": { + "nodes": { + "node": [ + { + "id": "a", + "class": "com.yomahub.liteflow.test.endlessLoop.cmp.ACmp" + }, + { + "id": "b", + "class": "com.yomahub.liteflow.test.endlessLoop.cmp.BCmp" + }, + { + "id": "c", + "class": "com.yomahub.liteflow.test.endlessLoop.cmp.CCmp" + }, + { + "id": "d", + "class": "com.yomahub.liteflow.test.endlessLoop.cmp.DCmp" + }, + { + "id": "e", + "class": "com.yomahub.liteflow.test.endlessLoop.cmp.ECmp" + } + ] + }, + "chain": [ + { + "name": "chain7", + "value": "THEN(a, chain8);" + }, + { + "name": "chain8", + "value": "THEN(b, chain9);" + }, + { + "name": "chain9", + "value": "WHEN(c, chain7);" + } + ] + } +} \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.xml new file mode 100644 index 000000000..fdd72433d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + THEN(a, chain2); + + + + THEN(b, chain3); + + + + THEN(c, chain1); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.yml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.yml new file mode 100644 index 000000000..c82163e7c --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/endlessLoop/flow.el.yml @@ -0,0 +1,20 @@ +flow: + nodes: + node: + - id: a + class: com.yomahub.liteflow.test.endlessLoop.cmp.ACmp + - id: b + class: com.yomahub.liteflow.test.endlessLoop.cmp.BCmp + - id: c + class: com.yomahub.liteflow.test.endlessLoop.cmp.CCmp + - id: d + class: com.yomahub.liteflow.test.endlessLoop.cmp.DCmp + - id: e + class: com.yomahub.liteflow.test.endlessLoop.cmp.ECmp + chain: + - name: chain4 + value: "THEN(a, chain5);" + - name: chain5 + value: "THEN(b, chain6);" + - name: chain6 + value: "THEN(c, chain5);" \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-main.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-main.el.xml deleted file mode 100644 index 4f479f6e5..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow-main.el.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - THEN(a, b, chain2); - - \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.json b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.json deleted file mode 100644 index e1012cc73..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "flow": { - "nodes": { - "node": [ - { - "id": "a", - "class": "com.yomahub.liteflow.test.subflow.cmp1.ACmp" - }, - { - "id": "b", - "class": "com.yomahub.liteflow.test.subflow.cmp1.BCmp" - }, - { - "id": "c", - "class": "com.yomahub.liteflow.test.subflow.cmp1.CCmp" - }, - { - "id": "d", - "class": "com.yomahub.liteflow.test.subflow.cmp1.DCmp" - }, - { - "id": "e", - "class": "com.yomahub.liteflow.test.subflow.cmp1.ECmp" - }, - { - "id": "f", - "class": "com.yomahub.liteflow.test.subflow.cmp2.FCmp" - }, - { - "id": "g", - "class": "com.yomahub.liteflow.test.subflow.cmp2.GCmp" - }, - { - "id": "h", - "class": "com.yomahub.liteflow.test.subflow.cmp2.HCmp" - }, - { - "id": "M", - "class": "com.yomahub.liteflow.test.subflow.cmp2.MCmp" - } - ] - }, - "chain": [ - { - "name": "chain7", - "value": "THEN(a, chain8);" - }, - { - "name": "chain8", - "value": "THEN(b, chain9);" - }, - { - "name": "chain9", - "value": "WHEN(c, chain7);" - } - ] - } -} \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.xml deleted file mode 100644 index 38120c94f..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - THEN(a, chain2); - - - - THEN(b, chain3); - - - - THEN(c, chain1); - - \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.yml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.yml deleted file mode 100644 index efdf7b431..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/subflow/endlessLoop/flow.el.yml +++ /dev/null @@ -1,28 +0,0 @@ -flow: - nodes: - node: - - id: a - class: com.yomahub.liteflow.test.subflow.cmp1.ACmp - - id: b - class: com.yomahub.liteflow.test.subflow.cmp1.BCmp - - id: c - class: com.yomahub.liteflow.test.subflow.cmp1.CCmp - - id: d - class: com.yomahub.liteflow.test.subflow.cmp1.DCmp - - id: e - class: com.yomahub.liteflow.test.subflow.cmp1.ECmp - - id: f - class: com.yomahub.liteflow.test.subflow.cmp2.FCmp - - id: g - class: com.yomahub.liteflow.test.subflow.cmp2.GCmp - - id: h - class: com.yomahub.liteflow.test.subflow.cmp2.HCmp - - id: h - class: com.yomahub.liteflow.test.subflow.cmp2.MCmp - chain: - - name: chain4 - value: "THEN(a, chain5);" - - name: chain5 - value: "THEN(b, chain6);" - - name: chain6 - value: "THEN(c, chain5);" \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowInDifferentConfigELSpringbootTest.java similarity index 57% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowInDifferentConfigELSpringbootTest.java index ca5ea0fed..90efa473c 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowInDifferentConfigELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowInDifferentConfigELSpringbootTest.java @@ -1,14 +1,15 @@ -package com.yomahub.liteflow.test.subflow.endlessLoop; +package com.yomahub.liteflow.test.endlessLoop; import com.yomahub.liteflow.core.FlowExecutor; -import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.exception.CyclicDependencyException; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.context.TestPropertySource; import javax.annotation.Resource; @@ -18,10 +19,9 @@ import javax.annotation.Resource; * @author luo yi * @since 2.11.1 */ -@TestPropertySource(value = "classpath:/subflow/endlessLoop/application-subInDifferentConfig1.properties") @SpringBootTest(classes = FlowInDifferentConfigELSpringbootTest.class) @EnableAutoConfiguration -@ComponentScan({ "com.yomahub.liteflow.test.subflow.cmp1", "com.yomahub.liteflow.test.subflow.cmp2" }) +@ComponentScan({ "com.yomahub.liteflow.test.endlessLoop.cmp"}) public class FlowInDifferentConfigELSpringbootTest extends BaseTest { @Resource @@ -30,8 +30,12 @@ public class FlowInDifferentConfigELSpringbootTest extends BaseTest { // 测试 chain 死循环 @Test public void testChainEndlessLoop() { - LiteflowResponse response = flowExecutor.execute2Resp("chain1", "it's a request"); - Assertions.assertFalse(response.isSuccess()); + Assertions.assertThrows(CyclicDependencyException.class, () -> { + LiteflowConfig config = LiteflowConfigGetter.get(); + config.setRuleSource("endlessLoop/flow-sub1.el.xml,endlessLoop/flow-sub2.el.yml"); + config.setSupportMultipleType(true); + flowExecutor.reloadRule(); + }); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowJsonELSpringBootTest.java similarity index 60% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowJsonELSpringBootTest.java index b0d97aa1b..8bcb71cbf 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowJsonELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowJsonELSpringBootTest.java @@ -1,14 +1,15 @@ -package com.yomahub.liteflow.test.subflow.endlessLoop; +package com.yomahub.liteflow.test.endlessLoop; import com.yomahub.liteflow.core.FlowExecutor; -import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.exception.CyclicDependencyException; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.context.TestPropertySource; import javax.annotation.Resource; @@ -18,10 +19,9 @@ import javax.annotation.Resource; * @author luo yi * @since 2.11.1 */ -@TestPropertySource(value = "classpath:/subflow/endlessLoop/application-json.properties") @SpringBootTest(classes = FlowJsonELSpringBootTest.class) @EnableAutoConfiguration -@ComponentScan({ "com.yomahub.liteflow.test.subflow.cmp1" }) +@ComponentScan({ "com.yomahub.liteflow.test.endlessLoop.cmp" }) public class FlowJsonELSpringBootTest extends BaseTest { @Resource @@ -30,8 +30,11 @@ public class FlowJsonELSpringBootTest extends BaseTest { // 测试 chain 死循环 @Test public void testChainEndlessLoop() { - LiteflowResponse response = flowExecutor.execute2Resp("chain7", "it's a request"); - Assertions.assertFalse(response.isSuccess()); + Assertions.assertThrows(CyclicDependencyException.class, () -> { + LiteflowConfig config = LiteflowConfigGetter.get(); + config.setRuleSource("endlessLoop/flow.el.json"); + flowExecutor.reloadRule(); + }); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowXMLELSpringBootTest.java similarity index 60% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowXMLELSpringBootTest.java index 6543f63d3..585cb02eb 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowXMLELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowXMLELSpringBootTest.java @@ -1,14 +1,15 @@ -package com.yomahub.liteflow.test.subflow.endlessLoop; +package com.yomahub.liteflow.test.endlessLoop; import com.yomahub.liteflow.core.FlowExecutor; -import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.exception.CyclicDependencyException; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.context.TestPropertySource; import javax.annotation.Resource; @@ -18,10 +19,9 @@ import javax.annotation.Resource; * @author luo yi * @since 2.11.1 */ -@TestPropertySource(value = "classpath:/subflow/endlessLoop/application-xml.properties") @SpringBootTest(classes = FlowXMLELSpringBootTest.class) @EnableAutoConfiguration -@ComponentScan({ "com.yomahub.liteflow.test.subflow.cmp1" }) +@ComponentScan({ "com.yomahub.liteflow.test.endlessLoop.cmp" }) public class FlowXMLELSpringBootTest extends BaseTest { @Resource @@ -30,8 +30,11 @@ public class FlowXMLELSpringBootTest extends BaseTest { // 测试 chain 死循环 @Test public void testChainEndlessLoop() { - LiteflowResponse response = flowExecutor.execute2Resp("chain1", "it's a request"); - Assertions.assertFalse(response.isSuccess()); + Assertions.assertThrows(CyclicDependencyException.class, () -> { + LiteflowConfig config = LiteflowConfigGetter.get(); + config.setRuleSource("endlessLoop/flow.el.xml"); + flowExecutor.reloadRule(); + }); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowYmlELSpringBootTest.java similarity index 60% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowYmlELSpringBootTest.java index f9a6d8f75..4df3d56db 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/subflow/endlessLoop/FlowYmlELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/FlowYmlELSpringBootTest.java @@ -1,14 +1,15 @@ -package com.yomahub.liteflow.test.subflow.endlessLoop; +package com.yomahub.liteflow.test.endlessLoop; import com.yomahub.liteflow.core.FlowExecutor; -import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.exception.CyclicDependencyException; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.context.TestPropertySource; import javax.annotation.Resource; @@ -18,10 +19,9 @@ import javax.annotation.Resource; * @author luo yi * @since 2.11.1 */ -@TestPropertySource(value = "classpath:/subflow/endlessLoop/application-yml.properties") @SpringBootTest(classes = FlowYmlELSpringBootTest.class) @EnableAutoConfiguration -@ComponentScan({ "com.yomahub.liteflow.test.subflow.cmp1" }) +@ComponentScan({ "com.yomahub.liteflow.test.endlessLoop.cmp" }) public class FlowYmlELSpringBootTest extends BaseTest { @Resource @@ -30,8 +30,11 @@ public class FlowYmlELSpringBootTest extends BaseTest { // 测试 chain 死循环 @Test public void testChainEndlessLoop() { - LiteflowResponse response = flowExecutor.execute2Resp("chain5", "it's a request"); - Assertions.assertFalse(response.isSuccess()); + Assertions.assertThrows(CyclicDependencyException.class, () -> { + LiteflowConfig config = LiteflowConfigGetter.get(); + config.setRuleSource("endlessLoop/flow.el.yml"); + flowExecutor.reloadRule(); + }); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ACmp.java new file mode 100644 index 000000000..17c75c038 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ACmp.java @@ -0,0 +1,14 @@ +package com.yomahub.liteflow.test.endlessLoop.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("a") +public class ACmp extends NodeComponent { + + @Override + public void process() { + System.out.println("Acomp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/BCmp.java new file mode 100644 index 000000000..cdaa88716 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/BCmp.java @@ -0,0 +1,14 @@ +package com.yomahub.liteflow.test.endlessLoop.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("b") +public class BCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("Bcomp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/CCmp.java new file mode 100644 index 000000000..7d9ec1ab6 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/CCmp.java @@ -0,0 +1,14 @@ +package com.yomahub.liteflow.test.endlessLoop.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("c") +public class CCmp extends NodeComponent { + + @Override + public void process() throws Exception { + System.out.println("Ccomp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/DCmp.java new file mode 100644 index 000000000..bf2f50f39 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/DCmp.java @@ -0,0 +1,14 @@ +package com.yomahub.liteflow.test.endlessLoop.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("d") +public class DCmp extends NodeComponent { + + @Override + public void process() throws Exception { + System.out.println("Dcomp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ECmp.java new file mode 100644 index 000000000..5a010ea22 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/endlessLoop/cmp/ECmp.java @@ -0,0 +1,14 @@ +package com.yomahub.liteflow.test.endlessLoop.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("e") +public class ECmp extends NodeComponent { + + @Override + public void process() throws Exception { + System.out.println("Ecomp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/endlessLoop/flow-sub1.el.xml similarity index 100% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub1.el.xml rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/endlessLoop/flow-sub1.el.xml diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub2.el.yml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/endlessLoop/flow-sub2.el.yml similarity index 100% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow-sub2.el.yml rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/endlessLoop/flow-sub2.el.yml diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.json b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/endlessLoop/flow.el.json similarity index 100% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.json rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/endlessLoop/flow.el.json diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/endlessLoop/flow.el.xml similarity index 100% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.xml rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/endlessLoop/flow.el.xml diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.yml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/endlessLoop/flow.el.yml similarity index 100% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/flow.el.yml rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/endlessLoop/flow.el.yml diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-json.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-json.properties deleted file mode 100644 index f19fd93f5..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-json.properties +++ /dev/null @@ -1 +0,0 @@ -liteflow.rule-source=subflow/endlessLoop/flow.el.json \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-subInDifferentConfig1.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-subInDifferentConfig1.properties deleted file mode 100644 index 418d38274..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-subInDifferentConfig1.properties +++ /dev/null @@ -1,2 +0,0 @@ -liteflow.rule-source=subflow/endlessLoop/flow-sub1.el.xml,subflow/endlessLoop/flow-sub2.el.yml -liteflow.support-multiple-type=true \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-xml.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-xml.properties deleted file mode 100644 index d2261bca5..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-xml.properties +++ /dev/null @@ -1 +0,0 @@ -liteflow.rule-source=subflow/endlessLoop/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-yml.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-yml.properties deleted file mode 100644 index a9088ce2e..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/subflow/endlessLoop/application-yml.properties +++ /dev/null @@ -1 +0,0 @@ -liteflow.rule-source=subflow/endlessLoop/flow.el.yml \ No newline at end of file