From ebc5d812f18d9036a813ad6a4fa3a5ff686ffcc7 Mon Sep 17 00:00:00 2001 From: bryan31 Date: Fri, 23 Jul 2021 18:31:06 +0800 Subject: [PATCH] =?UTF-8?q?enhancement=20#I426YS=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E4=B8=8D=E5=90=8C=E7=B1=BB=E5=9E=8B=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=B9=E5=BC=8F=E5=90=8C=E6=97=B6=E8=A7=A3?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yomahub/liteflow/core/FlowExecutor.java | 46 ++++++++++++------- .../liteflow/property/LiteflowConfig.java | 17 +++++++ .../liteflow/springboot/LiteflowProperty.java | 12 +++++ .../LiteflowPropertyAutoConfiguration.java | 1 + ...itional-spring-configuration-metadata.json | 13 ++++++ .../META-INF/liteflow-default.properties | 1 + .../LiteflowMultipleTypeSpringbootTest.java | 42 +++++++++++++++++ .../liteflow/test/multipleType/cmp/ACmp.java | 20 ++++++++ .../liteflow/test/multipleType/cmp/BCmp.java | 21 +++++++++ .../liteflow/test/multipleType/cmp/CCmp.java | 21 +++++++++ .../multipleType/application.properties | 2 + .../src/test/resources/multipleType/flow.xml | 10 ++++ .../src/test/resources/multipleType/flow.yml | 6 +++ 13 files changed, 196 insertions(+), 16 deletions(-) create mode 100644 liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/LiteflowMultipleTypeSpringbootTest.java create mode 100644 liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/ACmp.java create mode 100644 liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/BCmp.java create mode 100644 liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/CCmp.java create mode 100644 liteflow-spring-boot-starter/src/test/resources/multipleType/application.properties create mode 100644 liteflow-spring-boot-starter/src/test/resources/multipleType/flow.xml create mode 100644 liteflow-spring-boot-starter/src/test/resources/multipleType/flow.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 b20e0fa0a..ef49c686f 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 @@ -8,6 +8,7 @@ */ package com.yomahub.liteflow.core; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; @@ -98,6 +99,15 @@ public class FlowExecutor { } } rulePathList.add(path); + + //支持多类型的配置文件,分别解析 + if (liteflowConfig.isSupportMultipleType()){ + if (ObjectUtil.isNotNull(parser)) { + parser.parseMain(ListUtil.toList(path)); + } else { + throw new ConfigErrorException("parse error, please check liteflow config property"); + } + } } catch (Exception e) { String errorMsg = StrUtil.format("init flow executor cause error,cannot find the parse for path {}", path); LOG.error(errorMsg, e); @@ -105,23 +115,27 @@ public class FlowExecutor { } } - //检查Parser是否只有一个,因为多个不同的parser会造成子流程的混乱 - if (parserNameSet.size() > 1){ - String errorMsg = "cannot have multiple different parsers"; - LOG.error(errorMsg); - throw new MultipleParsersException(errorMsg); - } - - try{ - if (ObjectUtil.isNotNull(parser)) { - parser.parseMain(rulePathList); - } else { - throw new ConfigErrorException("parse error, please check liteflow config property"); + //单类型的配置文件,需要一起解析 + if (!liteflowConfig.isSupportMultipleType()){ + //检查Parser是否只有一个,因为多个不同的parser会造成子流程的混乱 + if (parserNameSet.size() > 1){ + String errorMsg = "cannot have multiple different parsers"; + LOG.error(errorMsg); + throw new MultipleParsersException(errorMsg); + } + + //进行 + try{ + if (ObjectUtil.isNotNull(parser)) { + parser.parseMain(rulePathList); + } else { + throw new ConfigErrorException("parse error, please check liteflow config property"); + } + } catch (Exception e) { + String errorMsg = StrUtil.format("init flow executor cause error,can not parse rule file {}", rulePathList); + LOG.error(errorMsg, e); + throw new FlowExecutorNotInitException(errorMsg); } - } catch (Exception e) { - String errorMsg = StrUtil.format("init flow executor cause error,can not parse rule file {}", rulePathList); - LOG.error(errorMsg, e); - throw new FlowExecutorNotInitException(errorMsg); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java b/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java index 2718da2a1..43e636ba2 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java @@ -8,6 +8,7 @@ package com.yomahub.liteflow.property; import cn.hutool.core.util.ObjectUtil; +import com.sun.org.apache.xpath.internal.operations.Bool; /** * liteflow的配置实体类 @@ -54,6 +55,10 @@ public class LiteflowConfig { //这个参数主要给编码式注册元数据的场景用的,结合FlowBus.addNode一起用 private Boolean parseOnStart; + //这个属性为true,则支持多种不同的类型的配置 + //但是要注意,不能将主流程和子流程分配在不同类型配置文件中 + private Boolean supportMultipleType; + public Boolean getEnable() { if (ObjectUtil.isNull(enable)){ return true; @@ -181,4 +186,16 @@ public class LiteflowConfig { public void setParseOnStart(Boolean parseOnStart) { this.parseOnStart = parseOnStart; } + + public Boolean isSupportMultipleType() { + if (ObjectUtil.isNull(supportMultipleType)){ + return true; + }else{ + return supportMultipleType; + } + } + + public void setSupportMultipleType(Boolean supportMultipleType) { + this.supportMultipleType = supportMultipleType; + } } diff --git a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowProperty.java b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowProperty.java index c1eae9961..bd38ae483 100644 --- a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowProperty.java +++ b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowProperty.java @@ -31,6 +31,10 @@ public class LiteflowProperty { //这个参数主要给编码式注册元数据的场景用的,结合FlowBus.addNode一起用 private boolean parseOnStart; + //这个属性为true,则支持多种不同的类型的配置 + //但是要注意,不能将主流程和子流程分配在不同类型配置文件中 + private boolean supportMultipleType; + public boolean isEnable() { return enable; } @@ -86,4 +90,12 @@ public class LiteflowProperty { public void setParseOnStart(boolean parseOnStart) { this.parseOnStart = parseOnStart; } + + public boolean isSupportMultipleType() { + return supportMultipleType; + } + + public void setSupportMultipleType(boolean supportMultipleType) { + this.supportMultipleType = supportMultipleType; + } } diff --git a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowPropertyAutoConfiguration.java b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowPropertyAutoConfiguration.java index 35c2b78ab..db3eb7488 100644 --- a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowPropertyAutoConfiguration.java +++ b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowPropertyAutoConfiguration.java @@ -34,6 +34,7 @@ public class LiteflowPropertyAutoConfiguration { liteflowConfig.setWhenQueueLimit(property.getWhenQueueLimit()); liteflowConfig.setParseOnStart(property.isParseOnStart()); liteflowConfig.setEnable(property.isEnable()); + liteflowConfig.setSupportMultipleType(property.isSupportMultipleType()); return liteflowConfig; } } diff --git a/liteflow-spring-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/liteflow-spring-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json index cb078d704..3e1775648 100644 --- a/liteflow-spring-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/liteflow-spring-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -1,5 +1,11 @@ { "properties": [ + { + "name": "liteflow.enable", + "type": "java.lang.Boolean", + "description": "Whether to turn on liteflow.", + "sourceType": "com.yomahub.liteflow.springboot.LiteflowProperty" + }, { "name": "liteflow.rule-source", "type": "java.lang.String", @@ -40,6 +46,13 @@ "sourceType": "com.yomahub.liteflow.springboot.LiteflowProperty", "defaultValue": true }, + { + "name": "liteflow.support-multiple-type", + "type": "java.lang.Boolean", + "description": "Whether to support multiple types of configuration.", + "sourceType": "com.yomahub.liteflow.springboot.LiteflowProperty", + "defaultValue": true + }, { "name": "liteflow.monitor.enable-log", "type": "java.lang.Boolean", diff --git a/liteflow-spring-boot-starter/src/main/resources/META-INF/liteflow-default.properties b/liteflow-spring-boot-starter/src/main/resources/META-INF/liteflow-default.properties index 4adc76792..6874eb820 100644 --- a/liteflow-spring-boot-starter/src/main/resources/META-INF/liteflow-default.properties +++ b/liteflow-spring-boot-starter/src/main/resources/META-INF/liteflow-default.properties @@ -5,6 +5,7 @@ liteflow.when-max-wait-seconds=15 liteflow.when-max-workers=4 liteflow.when-queue-limit=512 liteflow.parse-on-start=true +liteflow.support-multiple-type=false liteflow.monitor.enable-log=false liteflow.monitor.queue-limit=200 liteflow.monitor.delay=300000 diff --git a/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/LiteflowMultipleTypeSpringbootTest.java b/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/LiteflowMultipleTypeSpringbootTest.java new file mode 100644 index 000000000..47a350327 --- /dev/null +++ b/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/LiteflowMultipleTypeSpringbootTest.java @@ -0,0 +1,42 @@ +package com.yomahub.liteflow.test.multipleType; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.entity.data.DefaultSlot; +import com.yomahub.liteflow.entity.data.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +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 org.springframework.test.context.junit4.SpringRunner; + + +/** + * 测试springboot下的enable参数 + * @author Bryan.Zhang + * @since 2.5.10 + */ +@RunWith(SpringRunner.class) +@TestPropertySource(value = "classpath:/multipleType/application.properties") +@SpringBootTest(classes = LiteflowMultipleTypeSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({"com.yomahub.liteflow.test.multipleType.cmp"}) +public class LiteflowMultipleTypeSpringbootTest extends BaseTest { + + @Autowired + private FlowExecutor flowExecutor; + + @Test + public void testConfig() { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("a==>b==>c==>b==>a", response.getSlot().printStep()); + response = flowExecutor.execute2Resp("chain3", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("a==>b==>c", response.getSlot().printStep()); + } +} diff --git a/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/ACmp.java b/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/ACmp.java new file mode 100644 index 000000000..343dd85e8 --- /dev/null +++ b/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/ACmp.java @@ -0,0 +1,20 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.multipleType.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("ACmp executed!"); + } +} diff --git a/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/BCmp.java b/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/BCmp.java new file mode 100644 index 000000000..65ac7a70f --- /dev/null +++ b/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/BCmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.multipleType.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("BCmp executed!"); + } + +} diff --git a/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/CCmp.java b/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/CCmp.java new file mode 100644 index 000000000..dff3388b9 --- /dev/null +++ b/liteflow-spring-boot-starter/src/test/java/com/yomahub/liteflow/test/multipleType/cmp/CCmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.multipleType.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("c") +public class CCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-spring-boot-starter/src/test/resources/multipleType/application.properties b/liteflow-spring-boot-starter/src/test/resources/multipleType/application.properties new file mode 100644 index 000000000..a6da8abe5 --- /dev/null +++ b/liteflow-spring-boot-starter/src/test/resources/multipleType/application.properties @@ -0,0 +1,2 @@ +liteflow.support-multiple-type=true +liteflow.rule-source=multipleType/flow.xml,multipleType/flow.yml \ No newline at end of file diff --git a/liteflow-spring-boot-starter/src/test/resources/multipleType/flow.xml b/liteflow-spring-boot-starter/src/test/resources/multipleType/flow.xml new file mode 100644 index 000000000..38b703214 --- /dev/null +++ b/liteflow-spring-boot-starter/src/test/resources/multipleType/flow.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/liteflow-spring-boot-starter/src/test/resources/multipleType/flow.yml b/liteflow-spring-boot-starter/src/test/resources/multipleType/flow.yml new file mode 100644 index 000000000..4c1d8375a --- /dev/null +++ b/liteflow-spring-boot-starter/src/test/resources/multipleType/flow.yml @@ -0,0 +1,6 @@ +flow: + chain: + - name: chain3 + condition: + - type: then + value: 'a,b,c'