From be68ceedec62c58617cd481aca4dccb0f39aff8f Mon Sep 17 00:00:00 2001 From: zy <953725892@qq.com> Date: Mon, 3 Jul 2023 20:48:12 +0800 Subject: [PATCH] =?UTF-8?q?feature=20#I7HJFX=20=E4=B8=BA=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=BC=82=E6=AD=A5=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E8=AF=BB=E5=8F=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../element/condition/IteratorCondition.java | 10 ++ .../liteflow/property/LiteflowConfig.java | 12 +- ...lowDefaultParallelLoopExecutorBuilder.java | 2 +- .../config/LiteflowAutoConfiguration.java | 3 + .../solon/config/LiteflowProperty.java | 32 +++++ .../liteflow/springboot/LiteflowProperty.java | 32 +++++ .../LiteflowPropertyAutoConfiguration.java | 3 + .../parallelLoop/CustomStatefulException.java | 14 +++ .../parallelLoop/CustomThreadExecutor.java | 23 ++++ .../ParallelLoopELDeclSpringbootTest.java | 117 ++++++++++++++++++ .../liteflow/test/parallelLoop/cmp/ACmp.java | 23 ++++ .../liteflow/test/parallelLoop/cmp/BCmp.java | 23 ++++ .../liteflow/test/parallelLoop/cmp/CCmp.java | 23 ++++ .../liteflow/test/parallelLoop/cmp/DCmp.java | 32 +++++ .../liteflow/test/parallelLoop/cmp/ECmp.java | 35 ++++++ .../liteflow/test/parallelLoop/cmp/FCmp.java | 22 ++++ .../liteflow/test/parallelLoop/cmp/GCmp.java | 20 +++ .../liteflow/test/parallelLoop/cmp/HCmp.java | 21 ++++ .../liteflow/test/parallelLoop/cmp/ITCmp.java | 24 ++++ .../liteflow/test/parallelLoop/cmp/XCmp.java | 17 +++ .../liteflow/test/parallelLoop/cmp/YCmp.java | 23 ++++ .../liteflow/test/parallelLoop/cmp/ZCmp.java | 26 ++++ .../parallelLoop/application.properties | 4 + .../src/test/resources/parallelLoop/flow.xml | 46 +++++++ 24 files changed, 584 insertions(+), 3 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/CustomStatefulException.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/CustomThreadExecutor.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/ParallelLoopELDeclSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/CCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/DCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ECmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/FCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/GCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/HCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ITCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/XCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/parallelLoop/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/parallelLoop/flow.xml diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IteratorCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IteratorCondition.java index 8f182392e..a01edf4ac 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IteratorCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IteratorCondition.java @@ -98,6 +98,16 @@ public class IteratorCondition extends LoopCondition { } index++; } + //等待所有的异步执行完毕 + CompletableFuture resultCompletableFuture = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[]{})); + resultCompletableFuture.join(); + //获取所有的执行结果,如果有失败的,那么需要抛出异常 + for (CompletableFuture future : futureList) { + LoopFutureObj loopFutureObj = future.get(); + if (!loopFutureObj.isSuccess()) { + throw loopFutureObj.getEx(); + } + } } } finally { removeLoopIndex(executableItem); 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 a2bf28024..814ccf49a 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 @@ -420,7 +420,11 @@ public class LiteflowConfig { } public Integer getParallelMaxWorkers() { - return parallelMaxWorkers; + if(ObjectUtil.isNull(parallelMaxWorkers)){ + return 16; + }else{ + return parallelMaxWorkers; + } } public void setParallelMaxWorkers(Integer parallelMaxWorkers) { @@ -428,7 +432,11 @@ public class LiteflowConfig { } public Integer getParallelQueueLimit() { - return parallelQueueLimit; + if(ObjectUtil.isNull(parallelQueueLimit)){ + return 512; + }else{ + return parallelQueueLimit; + } } public void setParallelQueueLimit(Integer parallelQueueLimit) { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultParallelLoopExecutorBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultParallelLoopExecutorBuilder.java index 99938a7f7..7c9ebc377 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultParallelLoopExecutorBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultParallelLoopExecutorBuilder.java @@ -22,6 +22,6 @@ public class LiteFlowDefaultParallelLoopExecutorBuilder implements ExecutorBuild liteflowConfig = new LiteflowConfig(); } return buildDefaultExecutor(liteflowConfig.getParallelMaxWorkers(), liteflowConfig.getParallelMaxWorkers(), - liteflowConfig.getParallelQueueLimit(), "parallel-loop-thead-"); + liteflowConfig.getParallelQueueLimit(), "loop-thead-"); } } diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowAutoConfiguration.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowAutoConfiguration.java index e9eab764f..082f41ea5 100644 --- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowAutoConfiguration.java +++ b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowAutoConfiguration.java @@ -47,6 +47,9 @@ public class LiteflowAutoConfiguration { liteflowConfig.setMainExecutorClass(property.getMainExecutorClass()); liteflowConfig.setPrintExecutionLog(property.isPrintExecutionLog()); liteflowConfig.setSubstituteCmpClass(property.getSubstituteCmpClass()); + liteflowConfig.setParallelMaxWorkers(property.getParallelMaxWorkers()); + liteflowConfig.setParallelQueueLimit(property.getParallelQueueLimit()); + liteflowConfig.setParallelLoopExecutorClass(property.getParallelLoopExecutorClass()); return liteflowConfig; } diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowProperty.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowProperty.java index 26b0c9f0e..2454ba472 100644 --- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowProperty.java +++ b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowProperty.java @@ -70,6 +70,15 @@ public class LiteflowProperty { // 替补组件的class路径 private String substituteCmpClass; + //并行循环线程池类路径 + private String parallelLoopExecutorClass; + + //使用默认并行循环线程池时,最大线程数 + private Integer parallelMaxWorkers; + + //使用默认并行循环线程池时,最大队列数 + private Integer parallelQueueLimit; + public boolean isEnable() { return enable; } @@ -219,4 +228,27 @@ public class LiteflowProperty { this.ruleSourceExtData = ruleSourceExtData; } + public String getParallelLoopExecutorClass() { + return parallelLoopExecutorClass; + } + + public void setParallelLoopExecutorClass(String parallelLoopExecutorClass) { + this.parallelLoopExecutorClass = parallelLoopExecutorClass; + } + + public Integer getParallelMaxWorkers() { + return parallelMaxWorkers; + } + + public void setParallelMaxWorkers(Integer parallelMaxWorkers) { + this.parallelMaxWorkers = parallelMaxWorkers; + } + + public Integer getParallelQueueLimit() { + return parallelQueueLimit; + } + + public void setParallelQueueLimit(Integer parallelQueueLimit) { + this.parallelQueueLimit = parallelQueueLimit; + } } 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 173f673f4..d13fdd402 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 @@ -80,6 +80,14 @@ public class LiteflowProperty { // 规则文件/脚本文件变更监听 private Boolean enableMonitorFile; + private String parallelLoopExecutorClass; + + //使用默认并行循环线程池时,最大线程数 + private Integer parallelMaxWorkers; + + //使用默认并行循环线程池时,最大队列数 + private Integer parallelQueueLimit; + public Boolean getEnableMonitorFile() { return enableMonitorFile; } @@ -257,4 +265,28 @@ public class LiteflowProperty { public void setWhenMaxWaitTimeUnit(TimeUnit whenMaxWaitTimeUnit) { this.whenMaxWaitTimeUnit = whenMaxWaitTimeUnit; } + + public String getParallelLoopExecutorClass() { + return parallelLoopExecutorClass; + } + + public void setParallelLoopExecutorClass(String parallelLoopExecutorClass) { + this.parallelLoopExecutorClass = parallelLoopExecutorClass; + } + + public Integer getParallelMaxWorkers() { + return parallelMaxWorkers; + } + + public void setParallelMaxWorkers(Integer parallelMaxWorkers) { + this.parallelMaxWorkers = parallelMaxWorkers; + } + + public Integer getParallelQueueLimit() { + return parallelQueueLimit; + } + + public void setParallelQueueLimit(Integer parallelQueueLimit) { + this.parallelQueueLimit = parallelQueueLimit; + } } diff --git a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/config/LiteflowPropertyAutoConfiguration.java b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/config/LiteflowPropertyAutoConfiguration.java index 0571c662e..39bf982b0 100644 --- a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/config/LiteflowPropertyAutoConfiguration.java +++ b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/config/LiteflowPropertyAutoConfiguration.java @@ -48,6 +48,9 @@ public class LiteflowPropertyAutoConfiguration { liteflowConfig.setPrintExecutionLog(property.isPrintExecutionLog()); liteflowConfig.setSubstituteCmpClass(property.getSubstituteCmpClass()); liteflowConfig.setEnableMonitorFile(property.getEnableMonitorFile()); + liteflowConfig.setParallelMaxWorkers(property.getParallelMaxWorkers()); + liteflowConfig.setParallelQueueLimit(property.getParallelQueueLimit()); + liteflowConfig.setParallelLoopExecutorClass(property.getParallelLoopExecutorClass()); return liteflowConfig; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/CustomStatefulException.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/CustomStatefulException.java new file mode 100644 index 000000000..10cda69b6 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/CustomStatefulException.java @@ -0,0 +1,14 @@ +package com.yomahub.liteflow.test.parallelLoop; + +import com.yomahub.liteflow.exception.LiteFlowException; + +/** + * 用户自定义带状态码的异常 + */ +public class CustomStatefulException extends LiteFlowException { + + public CustomStatefulException(String code, String message) { + super(code, message); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/CustomThreadExecutor.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/CustomThreadExecutor.java new file mode 100644 index 000000000..72773f38a --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/CustomThreadExecutor.java @@ -0,0 +1,23 @@ +package com.yomahub.liteflow.test.parallelLoop; + +import cn.hutool.core.util.ObjectUtil; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.thread.ExecutorBuilder; + +import java.util.concurrent.ExecutorService; + +public class CustomThreadExecutor implements ExecutorBuilder { + + @Override + public ExecutorService buildExecutor() { + LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); + // 只有在非spring的场景下liteflowConfig才会为null + if (ObjectUtil.isNull(liteflowConfig)) { + liteflowConfig = new LiteflowConfig(); + } + return buildDefaultExecutor(liteflowConfig.getParallelMaxWorkers(), liteflowConfig.getParallelMaxWorkers(), + liteflowConfig.getParallelQueueLimit(), "customer-loop-thead-"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/ParallelLoopELDeclSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/ParallelLoopELDeclSpringbootTest.java new file mode 100644 index 000000000..bb3278517 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/ParallelLoopELDeclSpringbootTest.java @@ -0,0 +1,117 @@ +package com.yomahub.liteflow.test.parallelLoop; + +import cn.hutool.core.collection.ListUtil; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.exception.LiteFlowException; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.slot.DefaultContext; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +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; + +import javax.annotation.Resource; +import java.util.List; +import java.util.regex.Pattern; + +/** + * springboot环境EL异步循环测试 + * + * @author zhhhhy + */ +@RunWith(SpringRunner.class) +@TestPropertySource(value = "classpath:/parallelLoop/application.properties") +@SpringBootTest(classes = ParallelLoopELDeclSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.parallelLoop.cmp" }) +public class ParallelLoopELDeclSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + //测试并行FOR循环,循环次数直接在el中定义 + @Test + public void testParallelLoop1() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assert.assertTrue(response.isSuccess()); + } + + //测试并行FOR循环,循环次数由For组件定义 + @Test + public void testParallelLoop2() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assert.assertTrue(response.isSuccess()); + } + + //测试并行FOR循环中的BREAK组件能够正常发挥作用 + @Test + public void testParallelLoop3() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); + Assert.assertTrue(response.isSuccess()); + } + + //测试并行FOR循环中,主线程是否会正常等待所有并行子项完成后再继续执行 + @Test + public void testParallelLoop4() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assert.assertTrue(response.isSuccess()); + } + + @Test + //测试并行FOR循环中,某个并行子项抛出异常 + public void testParallelLoop5() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assert.assertFalse(response.isSuccess()); + Assert.assertEquals("300", response.getCode()); + Assert.assertNotNull(response.getCause()); + Assert.assertTrue(response.getCause() instanceof LiteFlowException); + Assert.assertNotNull(response.getSlot()); + } + + //并行的条件循环 + @Test + public void testParallelLoop6() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + Assert.assertTrue(response.isSuccess()); + } + + //并行的迭代循环 + @Test + public void testParallelLoop7() throws Exception { + List list = ListUtil.toList("1", "2", "3", "4", "5"); + LiteflowResponse response = flowExecutor.execute2Resp("chain7", list); + Assert.assertTrue(response.isSuccess()); + } + + //测试并行FOR循环中的index + @Test + public void testParallelLoop8() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain8", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + String regex = "(?!.*(.).*\\1)[0-4]{5}"; //匹配不包含重复数字的0-4的5位数字 + Pattern pattern = Pattern.compile(regex); + //e1,e2,e3分别并行执行5次,因此单个循环的顺序可以是任意的 + Assert.assertTrue(pattern.matcher(context.getData("loop_e1")).matches()); + Assert.assertTrue(pattern.matcher(context.getData("loop_e2")).matches()); + Assert.assertTrue(pattern.matcher(context.getData("loop_e3")).matches()); + } + + + //测试自定义线程池配置是否生效 + @Test + public void testParallelLoop9() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain9", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertTrue(context.getData("threadName").toString().startsWith("customer-loop-thead")); + } + + + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ACmp.java new file mode 100644 index 000000000..cf0f9ebef --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ACmp.java @@ -0,0 +1,23 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.stereotype.Component; + +@Component("a") +public class ACmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + System.out.println("ACmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/BCmp.java new file mode 100644 index 000000000..ab4164609 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/BCmp.java @@ -0,0 +1,23 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.stereotype.Component; + +@Component("b") +public class BCmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + System.out.println("BCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/CCmp.java new file mode 100644 index 000000000..d810bb501 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/CCmp.java @@ -0,0 +1,23 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.stereotype.Component; + +@Component("c") +public class CCmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/DCmp.java new file mode 100644 index 000000000..264d76d02 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/DCmp.java @@ -0,0 +1,32 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.slot.DefaultContext; +import org.springframework.stereotype.Component; + +@Component("d") +public class DCmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + DefaultContext context = bindCmp.getFirstContextBean(); + String key = "test"; + if (context.hasData(key)) { + int count = context.getData(key); + context.setData(key, ++count); + } + else { + context.setData(key, 1); + } + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ECmp.java new file mode 100644 index 000000000..b0d567f97 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ECmp.java @@ -0,0 +1,35 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.slot.DefaultContext; +import org.springframework.stereotype.Component; + +@Component("e") +public class ECmp { + + //注意与串行的ECmp相比,并行的ECmp的process方法必须保证线程安全 + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public synchronized void process(NodeComponent bindCmp) { + DefaultContext context = bindCmp.getFirstContextBean(); + String key = StrUtil.format("{}_{}", "loop", bindCmp.getTag()); + if (context.hasData(key)) { + String loopStr = context.getData(key); + String loopStrReturn = StrUtil.format("{}{}", loopStr, bindCmp.getLoopIndex()); + context.setData(key, loopStrReturn); + } + else { + context.setData(key, bindCmp.getLoopIndex().toString()); + } + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/FCmp.java new file mode 100644 index 000000000..fd2c05a4d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/FCmp.java @@ -0,0 +1,22 @@ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.stereotype.Component; + +@Component("f") +public class FCmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + try { + System.out.println("FCmp start to sleep 5s"); + Thread.sleep(5000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + System.out.println("FCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/GCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/GCmp.java new file mode 100644 index 000000000..571594439 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/GCmp.java @@ -0,0 +1,20 @@ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.test.exception.CustomStatefulException; +import org.springframework.stereotype.Component; + +@Component("g") +public class GCmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + if(bindCmp.getLoopIndex()==1){ + throw new CustomStatefulException("300", "chain execute custom stateful execption"); + } + System.out.println("GCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/HCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/HCmp.java new file mode 100644 index 000000000..eb4898bd1 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/HCmp.java @@ -0,0 +1,21 @@ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.slot.DefaultContext; +import com.yomahub.liteflow.test.exception.CustomStatefulException; +import org.springframework.stereotype.Component; + + +@Component("h") +public class HCmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + DefaultContext context = bindCmp.getFirstContextBean(); + context.setData("threadName", Thread.currentThread().getName()); + System.out.println("HCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ITCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ITCmp.java new file mode 100644 index 000000000..7b7211309 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ITCmp.java @@ -0,0 +1,24 @@ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.core.NodeIteratorComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import org.springframework.stereotype.Component; + +import java.util.Iterator; +import java.util.List; + +@Component("it") +@LiteflowCmpDefine(NodeTypeEnum.ITERATOR) +public class ITCmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_ITERATOR) + public Iterator processIterator(NodeComponent bindCmp) throws Exception { + List list = bindCmp.getRequestData(); + return list.iterator(); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/XCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/XCmp.java new file mode 100644 index 000000000..75091ac16 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/XCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; + +@LiteflowComponent("x") +public class XCmp { + + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_FOR, nodeType = NodeTypeEnum.FOR) + public int processFor(NodeComponent bindCmp) throws Exception { + return 3; + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java new file mode 100644 index 000000000..9e7713c34 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java @@ -0,0 +1,23 @@ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import com.yomahub.liteflow.slot.DefaultContext; + +@LiteflowComponent("y") +public class YCmp { + + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BREAK, nodeType = NodeTypeEnum.BREAK) + public boolean processBreak(NodeComponent bindCmp) throws Exception { + DefaultContext context = bindCmp.getFirstContextBean(); + int count = 0; + if(context.hasData("test")) { + count = context.getData("test"); + } + return count > 3; + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java new file mode 100644 index 000000000..8f01b2c24 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java @@ -0,0 +1,26 @@ +package com.yomahub.liteflow.test.parallelLoop.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import com.yomahub.liteflow.slot.DefaultContext; + +@LiteflowComponent("z") +public class ZCmp { + + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeType = NodeTypeEnum.WHILE) + public boolean processWhile(NodeComponent bindCmp) throws Exception { + DefaultContext context = bindCmp.getFirstContextBean(); + String key = "test"; + if (context.hasData(key)) { + int count = context.getData("test"); + return count < 5; + } + else { + return true; + } + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/parallelLoop/application.properties b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/parallelLoop/application.properties new file mode 100644 index 000000000..ebf6a6eda --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/parallelLoop/application.properties @@ -0,0 +1,4 @@ +liteflow.rule-source=parallelLoop/flow.xml +liteflow.parallel-max-workers = 10 +liteflow.parallel-queue-limit = 1024 +liteflow.parallel-loop-executor-class =com.yomahub.liteflow.test.parallelLoop.CustomThreadExecutor \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/parallelLoop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/parallelLoop/flow.xml new file mode 100644 index 000000000..c68bbd7c3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/parallelLoop/flow.xml @@ -0,0 +1,46 @@ + + + + FOR(2).parallel(true).DO(THEN(a,b,c)); + + + + FOR(x).parallel(true).DO(THEN(a,b,c)); + + + + FOR(100).parallel(true).DO(THEN(a,b,d)).BREAK(y); + + + + FOR(x).parallel(true).DO(THEN(a,b,f)); + + + + FOR(x).parallel(true).DO(THEN(a,b,g)); + + + + WHILE(z).parallel(true).DO(THEN(a,d)); + + + + ITERATOR(it).parallel(true).DO(THEN(a,b)); + + + + FOR(5).parallel(true).DO( + WHEN( + THEN(a,e.tag("e1")), + THEN(c,e.tag("e2")), + THEN(b,e.tag("e3")) + ) + ); + + + + + FOR(x).parallel(true).DO(THEN(a,b,h)); + + + \ No newline at end of file