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