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 b32c5b04e..3693018ac 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 @@ -89,8 +89,6 @@ public class FlowExecutor { if (StrUtil.isBlank(liteflowConfig.getRuleSource())) { return; } - // 初始化前清空缓存 - FlowBus.cleanChainMap(); List sourceRulePathList = Lists.newArrayList(liteflowConfig.getRuleSource().split(",|;")); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index 2cefb41f3..f7abf89cf 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -18,7 +18,6 @@ import com.yomahub.liteflow.core.ScriptComponent; import com.yomahub.liteflow.core.ScriptCondComponent; import com.yomahub.liteflow.enums.FlowParserTypeEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; -import com.yomahub.liteflow.exception.ChainDuplicateException; import com.yomahub.liteflow.exception.ComponentCannotRegisterException; import com.yomahub.liteflow.flow.element.Chain; import com.yomahub.liteflow.flow.element.Node; @@ -63,8 +62,6 @@ public class FlowBus { public static void addChain(String chainName) { if (!chainMap.containsKey(chainName)) { chainMap.put(chainName, new Chain(chainName)); - } else { - throw new ChainDuplicateException(String.format("[chain name duplicate] chainName=%s", chainName)); } } @@ -161,7 +158,7 @@ public class FlowBus { nodeMap.put(nodeId, node); } catch (Exception e) { - String error = StrUtil.format("component[{}][{}] register error", cmpClazz.getName(), StringUtils.isEmpty(name)?nodeId:nodeId+"("+name+")"); + String error = StrUtil.format("component[{}][{}] register error", cmpClazz.getName(), StringUtils.isEmpty(name) ? nodeId : nodeId + "(" + name + ")"); LOG.error(error, e); throw new ComponentCannotRegisterException(error); } @@ -189,10 +186,6 @@ public class FlowBus { cleanScriptCache(); } - public static void cleanChainMap(){ - chainMap.clear(); - } - public static void cleanScriptCache() { //如果引入了脚本组件SPI,则还需要清理脚本的缓存 try { @@ -205,8 +198,6 @@ public class FlowBus { } public static void refreshFlowMetaData(FlowParserTypeEnum type, String content) throws Exception { - // 刷新前清空缓存 - cleanChainMap(); if (type.equals(FlowParserTypeEnum.TYPE_XML)) { new LocalXmlFlowParser().parse(content); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java index e102ff4e7..c52d883de 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java @@ -9,12 +9,15 @@ import com.yomahub.liteflow.builder.LiteFlowChainBuilder; import com.yomahub.liteflow.builder.prop.ChainPropBean; import com.yomahub.liteflow.builder.prop.NodePropBean; import com.yomahub.liteflow.enums.ConditionTypeEnum; +import com.yomahub.liteflow.exception.ChainDuplicateException; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.spi.holder.ContextCmpInitHolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; import static com.yomahub.liteflow.common.ChainConstant.ANY; import static com.yomahub.liteflow.common.ChainConstant.CHAIN; @@ -42,6 +45,8 @@ public abstract class JsonFlowParser extends BaseFlowParser { private final Logger LOG = LoggerFactory.getLogger(JsonFlowParser.class); + private final Set CHAIN_NAME_SET = new CopyOnWriteArraySet<>(); + public void parse(String content) throws Exception { parse(ListUtil.toList(content)); } @@ -80,9 +85,18 @@ public abstract class JsonFlowParser extends BaseFlowParser { //先在元数据里放上chain chainArray.forEach(o -> { JSONObject innerJsonObject = (JSONObject) o; + + // 校验加载的 chainName 是否有重复的 + String chainName = innerJsonObject.getString(NAME); + if (!CHAIN_NAME_SET.add(chainName)) { + throw new ChainDuplicateException(String.format("[chain name duplicate] chainName=%s", chainName)); + } + FlowBus.addChain(innerJsonObject.getString(NAME)); }); }); + // 清空 + CHAIN_NAME_SET.clear(); for (JSONObject flowJsonObject : flowJsonObjectList) { // 当存在节点定义时,解析node节点 diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java index 6bc8c6e49..cf6468a0e 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java @@ -7,6 +7,7 @@ import com.yomahub.liteflow.builder.LiteFlowChainBuilder; import com.yomahub.liteflow.builder.prop.ChainPropBean; import com.yomahub.liteflow.builder.prop.NodePropBean; import com.yomahub.liteflow.enums.ConditionTypeEnum; +import com.yomahub.liteflow.exception.ChainDuplicateException; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.spi.holder.ContextCmpInitHolder; import org.dom4j.Document; @@ -17,6 +18,8 @@ import org.slf4j.LoggerFactory; import java.util.Iterator; import java.util.List; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; import static com.yomahub.liteflow.common.ChainConstant.ANY; import static com.yomahub.liteflow.common.ChainConstant.CHAIN; @@ -43,6 +46,8 @@ public abstract class XmlFlowParser extends BaseFlowParser { private final Logger LOG = LoggerFactory.getLogger(XmlFlowParser.class); + private final Set CHAIN_NAME_SET = new CopyOnWriteArraySet<>(); + public void parse(String content) throws Exception { parse(ListUtil.toList(content)); } @@ -76,8 +81,19 @@ public abstract class XmlFlowParser extends BaseFlowParser { List chainList = document.getRootElement().elements(CHAIN); //先在元数据里放上chain - chainList.forEach(e -> FlowBus.addChain(e.attributeValue(NAME))); + chainList.forEach(e -> { + + // 校验加载的 chainName 是否有重复的 + String chainName = e.attributeValue(NAME); + if (!CHAIN_NAME_SET.add(chainName)) { + throw new ChainDuplicateException(String.format("[chain name duplicate] chainName=%s", chainName)); + } + + FlowBus.addChain(chainName); + }); }); + // 清空 + CHAIN_NAME_SET.clear(); for (Document document : documentList) { Element rootElement = document.getRootElement(); diff --git a/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportSpringbootTest.java b/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportSpringbootTest.java index 379854374..7837ffa6a 100644 --- a/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportSpringbootTest.java +++ b/liteflow-testcase-declare-component/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportSpringbootTest.java @@ -26,7 +26,7 @@ public class SpringELSupportSpringbootTest extends BaseTest { //测试springEL的解析情况 @Test public void testSpringELParser() { - LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg"); Assert.assertTrue(response.isSuccess()); } } diff --git a/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow1.xml b/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow1.xml index 0775c5ec1..de73569cd 100644 --- a/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow1.xml +++ b/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow1.xml @@ -10,13 +10,13 @@ - + - + \ No newline at end of file diff --git a/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow2.xml b/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow2.xml index d739f6b53..c77305d52 100644 --- a/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow2.xml +++ b/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow2.xml @@ -1,7 +1,7 @@ - + diff --git a/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow3.xml b/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow3.xml index 0a898126c..8eedecef6 100644 --- a/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow3.xml +++ b/liteflow-testcase-declare-component/src/test/resources/parser/subFoder1/subFoder2/flow3.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportSpringbootTest.java b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportSpringbootTest.java index 379854374..7837ffa6a 100644 --- a/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportSpringbootTest.java +++ b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportSpringbootTest.java @@ -26,7 +26,7 @@ public class SpringELSupportSpringbootTest extends BaseTest { //测试springEL的解析情况 @Test public void testSpringELParser() { - LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg"); Assert.assertTrue(response.isSuccess()); } } diff --git a/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow1.xml b/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow1.xml index 0775c5ec1..de73569cd 100644 --- a/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow1.xml +++ b/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow1.xml @@ -10,13 +10,13 @@ - + - + \ No newline at end of file diff --git a/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow2.xml b/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow2.xml index d739f6b53..c77305d52 100644 --- a/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow2.xml +++ b/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow2.xml @@ -1,7 +1,7 @@ - + diff --git a/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow3.xml b/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow3.xml index 0a898126c..8eedecef6 100644 --- a/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow3.xml +++ b/liteflow-testcase-springboot/src/test/resources/parser/subFoder1/subFoder2/flow3.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file