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 23dc8fa3e..4325469b1 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 @@ -26,6 +26,7 @@ import com.yomahub.liteflow.parser.*; import com.yomahub.liteflow.property.LiteflowConfig; import com.yomahub.liteflow.property.LiteflowConfigGetter; import com.yomahub.liteflow.spi.holder.ContextAwareHolder; +import com.yomahub.liteflow.thread.ExecutorHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +34,8 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; /** * 流程规则主要执行器类 @@ -58,7 +61,9 @@ public class FlowExecutor { private LiteflowConfig liteflowConfig; - public FlowExecutor(){ + public FlowExecutor() { + //设置FlowExecutor的Holder,虽然大部分地方都可以通过Spring上下文获取到,但放入Holder,还是为了某些地方能方便的取到 + FlowExecutorHolder.setHolder(this); //初始化DataBus DataBus.init(); } @@ -67,6 +72,8 @@ public class FlowExecutor { this.liteflowConfig = liteflowConfig; //把liteFlowConfig设到LiteFlowGetter中去 LiteflowConfigGetter.setLiteflowConfig(liteflowConfig); + //设置FlowExecutor的Holder,虽然大部分地方都可以通过Spring上下文获取到,但放入Holder,还是为了某些地方能方便的取到 + FlowExecutorHolder.setHolder(this); if (liteflowConfig.isParseOnStart()){ this.init(); } @@ -327,6 +334,12 @@ public class FlowExecutor { return this.execute2Resp(chainId, param, slotClazz, null, false); } + public Future> execute2Future(String chainId, Object param, Class slotClazz) { + return ExecutorHelper.loadInstance().buildMainExecutor(liteflowConfig.getMainExecutorClass()).submit(() + -> FlowExecutorHolder.loadInstance().execute2Resp(chainId, param, slotClazz, null, false)); + + } + public LiteflowResponse execute2Resp(String chainId, Object param, Class slotClazz, Integer slotIndex, boolean isInnerChain) { LiteflowResponse response = new LiteflowResponse<>(); @@ -427,6 +440,7 @@ public class FlowExecutor { public void setLiteflowConfig(LiteflowConfig liteflowConfig) { this.liteflowConfig = liteflowConfig; + //把liteFlowConfig设到LiteFlowGetter中去 LiteflowConfigGetter.setLiteflowConfig(liteflowConfig); } } \ No newline at end of file diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutorHolder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutorHolder.java index 8371c909c..9848af46e 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutorHolder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutorHolder.java @@ -22,6 +22,10 @@ public class FlowExecutorHolder { return flowExecutor; } + public static void setHolder(FlowExecutor flowExecutor){ + FlowExecutorHolder.flowExecutor = flowExecutor; + } + public static void clean(){ flowExecutor = null; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/entity/flow/Chain.java b/liteflow-core/src/main/java/com/yomahub/liteflow/entity/flow/Chain.java index 0f8267643..423f3d618 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/entity/flow/Chain.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/entity/flow/Chain.java @@ -133,13 +133,13 @@ public class Chain implements Executable { Slot slot = DataBus.getSlot(slotIndex); //此方法其实只会初始化一次Executor,不会每次都会初始化。Executor是唯一的 - ExecutorService parallelExecutor = ExecutorHelper.loadInstance().buildExecutor(condition.getThreadExecutorClass()); + ExecutorService parallelExecutor = ExecutorHelper.loadInstance().buildWhenExecutor(condition.getThreadExecutorClass()); //获得liteflow的参数 LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); //定义是否中断参数 - //这里为什么要定义成数组呢,因为后面lumbda要用到,根据final不能修改引用的原则,这里用了数组对象 + //这里为什么要定义成数组呢,因为后面lambda要用到,根据final不能修改引用的原则,这里用了数组对象 final boolean[] interrupted = {false}; //这里主要是做了封装CompletableFuture对象,用lumbda表达式做了很多事情,这句代码要仔细理清 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 230122a86..0d2dfb075 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 @@ -76,6 +76,12 @@ public class LiteflowConfig { //是否打印liteflow banner private Boolean printBanner; + //FlowExecutor的execute2Future的线程数 + private Integer mainExecutorWorks; + + //FlowExecutor的execute2Future的自定义线程池 + private String mainExecutorClass; + public Boolean getEnable() { if (ObjectUtil.isNull(enable)) { return true; @@ -254,7 +260,7 @@ public class LiteflowConfig { public String getThreadExecutorClass() { if (StrUtil.isBlank(threadExecutorClass)){ - return "com.yomahub.liteflow.thread.LiteFlowDefaultExecutorBuilder"; + return "com.yomahub.liteflow.thread.LiteFlowDefaultWhenExecutorBuilder"; }else{ return threadExecutorClass; } @@ -275,4 +281,28 @@ public class LiteflowConfig { public void setNodeExecutorClass(String nodeExecutorClass) { this.nodeExecutorClass = nodeExecutorClass; } + + public Integer getMainExecutorWorks() { + if (ObjectUtil.isNull(mainExecutorWorks)){ + return 64; + }else{ + return mainExecutorWorks; + } + } + + public void setMainExecutorWorks(Integer mainExecutorWorks) { + this.mainExecutorWorks = mainExecutorWorks; + } + + public String getMainExecutorClass() { + if (StrUtil.isBlank(mainExecutorClass)){ + return "com.yomahub.liteflow.thread.LiteFlowDefaultMainExecutorBuilder"; + }else{ + return mainExecutorClass; + } + } + + public void setMainExecutorClass(String mainExecutorClass) { + this.mainExecutorClass = mainExecutorClass; + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorHelper.java b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorHelper.java index 9bf23839b..f62314197 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorHelper.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorHelper.java @@ -9,6 +9,7 @@ package com.yomahub.liteflow.thread; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.google.common.collect.Maps; import com.yomahub.liteflow.exception.ThreadExecutorServiceCreateException; @@ -87,46 +88,49 @@ public class ExecutorHelper { } } - //构建全局默认线程池 - public ExecutorService buildExecutor() { + //构建默认when线程池 + public ExecutorService buildWhenExecutor() { LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); - if (!executorServiceMap.containsKey(liteflowConfig.getThreadExecutorClass())) { - ExecutorService executorService = getExecutorBuilder(liteflowConfig.getThreadExecutorClass()).buildExecutor(); - executorServiceMap.put(liteflowConfig.getThreadExecutorClass(), executorService); - } - return executorServiceMap.get(liteflowConfig.getThreadExecutorClass()); + return buildWhenExecutor(liteflowConfig.getThreadExecutorClass()); } - //构建线程池执行器 - 支持多个when公用一个线程池 - public ExecutorService buildExecutor(String threadExecutorClass) { - if (StrUtil.isBlank(threadExecutorClass)) { - return buildExecutor(); + //构建when线程池 - 支持多个when公用一个线程池 + public ExecutorService buildWhenExecutor(String clazz) { + if (StrUtil.isBlank(clazz)) { + return buildWhenExecutor(); } - ExecutorService executorServiceFromCache = executorServiceMap.get(threadExecutorClass); - if (executorServiceFromCache != null) { - return executorServiceFromCache; - } else { - ExecutorService executorService = getExecutorBuilder(threadExecutorClass).buildExecutor(); - executorServiceMap.put(threadExecutorClass, executorService); - return executorService; + return getExecutorService(clazz); + } + + //构建默认的FlowExecutor线程池,用于execute2Future方法 + public ExecutorService buildMainExecutor(){ + LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); + return buildMainExecutor(liteflowConfig.getMainExecutorClass()); + } + + public ExecutorService buildMainExecutor(String clazz){ + if (StrUtil.isBlank(clazz)) { + return buildMainExecutor(); } + return getExecutorService(clazz); } /** - *

- * 根据线程执行构建者Class类名获取ExecutorBuilder实例 - *

- * - * @param threadExecutorClass 线程执行class全量名 - * @return com.yomahub.liteflow.thread.ExecutorBuilder - * @author sikadai - * @date 2022/1/21 23:04 + * 根据线程执行构建者Class类名获取ExecutorService实例 */ - private ExecutorBuilder getExecutorBuilder(String threadExecutorClass) { - try { - Class executorClass = (Class) Class.forName(threadExecutorClass); - return ContextAwareHolder.loadContextAware().registerBean(executorClass); - } catch (Exception e) { + private ExecutorService getExecutorService(String clazz) { + try{ + ExecutorService executorServiceFromCache = executorServiceMap.get(clazz); + if (ObjectUtil.isNotNull(executorServiceFromCache)) { + return executorServiceFromCache; + } else { + Class executorClass = (Class) Class.forName(clazz); + ExecutorBuilder executorBuilder = ContextAwareHolder.loadContextAware().registerBean(executorClass); + ExecutorService executorService = executorBuilder.buildExecutor(); + executorServiceMap.put(clazz, executorService); + return executorService; + } + }catch (Exception e){ LOG.error(e.getMessage(), e); throw new ThreadExecutorServiceCreateException(e.getMessage()); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultMainExecutorBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultMainExecutorBuilder.java new file mode 100644 index 000000000..12c41babd --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultMainExecutorBuilder.java @@ -0,0 +1,23 @@ +package com.yomahub.liteflow.thread; + +import cn.hutool.core.util.ObjectUtil; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; + +import java.util.concurrent.ExecutorService; + +public class LiteFlowDefaultMainExecutorBuilder implements ExecutorBuilder{ + @Override + public ExecutorService buildExecutor() { + LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); + //只有在非spring的场景下liteflowConfig才会为null + if (ObjectUtil.isNull(liteflowConfig)){ + liteflowConfig = new LiteflowConfig(); + } + return buildDefaultExecutor( + liteflowConfig.getMainExecutorWorks(), + liteflowConfig.getMainExecutorWorks(), + 200, + "lf-main-thead-"); + } +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultExecutorBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultWhenExecutorBuilder.java similarity index 91% rename from liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultExecutorBuilder.java rename to liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultWhenExecutorBuilder.java index 20f4ea23c..1cf546422 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultExecutorBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultWhenExecutorBuilder.java @@ -11,7 +11,7 @@ import java.util.concurrent.*; * @author Bryan.Zhang * @since 2.6.6 */ -public class LiteFlowDefaultExecutorBuilder implements ExecutorBuilder{ +public class LiteFlowDefaultWhenExecutorBuilder implements ExecutorBuilder{ @Override public ExecutorService buildExecutor() { LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); 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 cbe29d691..48a40ddad 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 @@ -50,6 +50,12 @@ public class LiteflowProperty { // 节点执行器class全名 private String nodeExecutorClass; + //FlowExecutor的execute2Future的线程数 + private int mainExecutorWorks; + + //FlowExecutor的execute2Future的自定义线程池 + private String mainExecutorClass; + public boolean isEnable() { return enable; } @@ -153,4 +159,20 @@ public class LiteflowProperty { public void setNodeExecutorClass(String nodeExecutorClass) { this.nodeExecutorClass = nodeExecutorClass; } + + public int getMainExecutorWorks() { + return mainExecutorWorks; + } + + public void setMainExecutorWorks(int mainExecutorWorks) { + this.mainExecutorWorks = mainExecutorWorks; + } + + public String getMainExecutorClass() { + return mainExecutorClass; + } + + public void setMainExecutorClass(String mainExecutorClass) { + this.mainExecutorClass = mainExecutorClass; + } } 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 8ea46e836..b0d9bf73e 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 @@ -42,6 +42,8 @@ public class LiteflowPropertyAutoConfiguration { liteflowConfig.setZkNode(property.getZkNode()); liteflowConfig.setPrintBanner(property.isPrintBanner()); liteflowConfig.setNodeExecutorClass(property.getNodeExecutorClass()); + liteflowConfig.setMainExecutorWorks(property.getMainExecutorWorks()); + liteflowConfig.setMainExecutorClass(property.getMainExecutorClass()); return liteflowConfig; } } 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 01228a835..049a49577 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 @@ -2,7 +2,9 @@ liteflow.enable=true liteflow.print-banner=true liteflow.zk-node=/lite-flow/flow liteflow.slot-size=1024 -liteflow.thread-executor-class=com.yomahub.liteflow.thread.LiteFlowDefaultExecutorBuilder +liteflow.main-executor-works=64 +liteflow.main-executor-class=com.yomahub.liteflow.thread.LiteFlowDefaultMainExecutorBuilder +liteflow.thread-executor-class=com.yomahub.liteflow.thread.LiteFlowDefaultWhenExecutorBuilder liteflow.when-max-wait-seconds=15 liteflow.when-max-workers=16 liteflow.when-queue-limit=512 diff --git a/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureTest.java b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureTest.java new file mode 100644 index 000000000..884be012d --- /dev/null +++ b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureTest.java @@ -0,0 +1,37 @@ +package com.yomahub.liteflow.test.execute2Future; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.core.FlowExecutorHolder; +import com.yomahub.liteflow.entity.data.DefaultSlot; +import com.yomahub.liteflow.entity.data.LiteflowResponse; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import java.util.concurrent.Future; + +/** + * nospring环境执行返回future的例子 + * @author Bryan.Zhang + * @since 2.6.13 + */ +public class Executor2FutureTest extends BaseTest { + + private static FlowExecutor flowExecutor; + + @BeforeClass + public static void init(){ + LiteflowConfig config = new LiteflowConfig(); + config.setRuleSource("execute2Future/flow.xml"); + flowExecutor = FlowExecutorHolder.loadInstance(config); + } + + @Test + public void testFuture() throws Exception{ + Future> future = flowExecutor.execute2Future("chain1", "arg", DefaultSlot.class); + LiteflowResponse response = future.get(); + Assert.assertTrue(response.isSuccess()); + } + +} diff --git a/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/ACmp.java b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/ACmp.java new file mode 100644 index 000000000..bd4d7493e --- /dev/null +++ b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/ACmp.java @@ -0,0 +1,18 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.execute2Future.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class ACmp extends NodeComponent { + + @Override + public void process() { + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/BCmp.java b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/BCmp.java new file mode 100644 index 000000000..8a717d2a0 --- /dev/null +++ b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/BCmp.java @@ -0,0 +1,19 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.execute2Future.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class BCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("BCmp executed!"); + } + +} diff --git a/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/CCmp.java b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/CCmp.java new file mode 100644 index 000000000..9c18d7e49 --- /dev/null +++ b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/CCmp.java @@ -0,0 +1,19 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.execute2Future.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class CCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/DCmp.java b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/DCmp.java new file mode 100644 index 000000000..11edc94f3 --- /dev/null +++ b/liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/DCmp.java @@ -0,0 +1,19 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.execute2Future.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class DCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-nospring/src/test/resources/execute2Future/flow.xml b/liteflow-testcase-nospring/src/test/resources/execute2Future/flow.xml new file mode 100644 index 000000000..98c5a1b68 --- /dev/null +++ b/liteflow-testcase-nospring/src/test/resources/execute2Future/flow.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureSpringbootTest.java b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureSpringbootTest.java new file mode 100644 index 000000000..d2460105b --- /dev/null +++ b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureSpringbootTest.java @@ -0,0 +1,41 @@ +package com.yomahub.liteflow.test.execute2Future; + +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.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.concurrent.Future; + +/** + * springboot环境执行返回future的例子 + * @author Bryan.Zhang + * @since 2.6.13 + */ +@RunWith(SpringRunner.class) +@TestPropertySource(value = "classpath:/execute2Future/application.properties") +@SpringBootTest(classes = Executor2FutureSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({"com.yomahub.liteflow.test.execute2Future.cmp"}) +public class Executor2FutureSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + @Test + public void testFuture() throws Exception{ + Future> future = flowExecutor.execute2Future("chain1", "arg", DefaultSlot.class); + LiteflowResponse response = future.get(); + Assert.assertTrue(response.isSuccess()); + } + +} diff --git a/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/ACmp.java b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/ACmp.java new file mode 100644 index 000000000..05dabbd3d --- /dev/null +++ b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/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.execute2Future.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-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/BCmp.java b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/BCmp.java new file mode 100644 index 000000000..8683ad9e1 --- /dev/null +++ b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/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.execute2Future.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-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/CCmp.java b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/CCmp.java new file mode 100644 index 000000000..bfb159206 --- /dev/null +++ b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/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.execute2Future.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-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/DCmp.java b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/DCmp.java new file mode 100644 index 000000000..b92003006 --- /dev/null +++ b/liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/DCmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.execute2Future.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("d") +public class DCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-springboot/src/test/resources/execute2Future/application.properties b/liteflow-testcase-springboot/src/test/resources/execute2Future/application.properties new file mode 100644 index 000000000..1545d0a13 --- /dev/null +++ b/liteflow-testcase-springboot/src/test/resources/execute2Future/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=execute2Future/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-springboot/src/test/resources/execute2Future/flow.xml b/liteflow-testcase-springboot/src/test/resources/execute2Future/flow.xml new file mode 100644 index 000000000..a7517a2cf --- /dev/null +++ b/liteflow-testcase-springboot/src/test/resources/execute2Future/flow.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureSpringTest.java b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureSpringTest.java new file mode 100644 index 000000000..c470fa309 --- /dev/null +++ b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureSpringTest.java @@ -0,0 +1,35 @@ +package com.yomahub.liteflow.test.execute2Future; + +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.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.util.concurrent.Future; + +/** + * spring环境执行返回future的例子 + * @author Bryan.Zhang + * @since 2.6.13 + */ +@RunWith(SpringRunner.class) +@ContextConfiguration("classpath:/execute2Future/application.xml") +public class Executor2FutureSpringTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + @Test + public void testFuture() throws Exception{ + Future> future = flowExecutor.execute2Future("chain1", "arg", DefaultSlot.class); + LiteflowResponse response = future.get(); + Assert.assertTrue(response.isSuccess()); + } + +} diff --git a/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/ACmp.java b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/ACmp.java new file mode 100644 index 000000000..05dabbd3d --- /dev/null +++ b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/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.execute2Future.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-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/BCmp.java b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/BCmp.java new file mode 100644 index 000000000..8683ad9e1 --- /dev/null +++ b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/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.execute2Future.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-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/CCmp.java b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/CCmp.java new file mode 100644 index 000000000..bfb159206 --- /dev/null +++ b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/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.execute2Future.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-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/DCmp.java b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/DCmp.java new file mode 100644 index 000000000..b92003006 --- /dev/null +++ b/liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/execute2Future/cmp/DCmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.execute2Future.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("d") +public class DCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-springnative/src/test/resources/execute2Future/application.xml b/liteflow-testcase-springnative/src/test/resources/execute2Future/application.xml new file mode 100644 index 000000000..3189e6276 --- /dev/null +++ b/liteflow-testcase-springnative/src/test/resources/execute2Future/application.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/liteflow-testcase-springnative/src/test/resources/execute2Future/flow.xml b/liteflow-testcase-springnative/src/test/resources/execute2Future/flow.xml new file mode 100644 index 000000000..a7517a2cf --- /dev/null +++ b/liteflow-testcase-springnative/src/test/resources/execute2Future/flow.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file