From 69b7fdf99176c3369ebda320e05c26e01c722f37 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Wed, 31 Jan 2024 13:57:37 +0800 Subject: [PATCH] =?UTF-8?q?future=20#I9050W=20=E4=B8=BA=E6=AF=8F=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E4=B8=8A=E4=B8=8B=E6=96=87=E6=8F=90=E4=BE=9B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=90=8D=E5=AD=97=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=97=B6?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=A0=B9=E6=8D=AE=E5=90=8D=E5=AD=97=E6=9D=A5?= =?UTF-8?q?=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yomahub/liteflow/core/NodeComponent.java | 4 ++ .../liteflow/flow/LiteflowResponse.java | 4 ++ .../liteflow/script/ScriptExecutor.java | 12 +----- .../com/yomahub/liteflow/slot/DataBus.java | 23 ++++++++--- .../java/com/yomahub/liteflow/slot/Slot.java | 25 ++++++++---- .../ContextBeanSpringbootTest.java | 38 +++++++++++++++++++ .../liteflow/test/contextBean/cmp/ACmp.java | 23 +++++++++++ .../liteflow/test/contextBean/cmp/BCmp.java | 21 ++++++++++ .../test/contextBean/context/TestContext.java | 32 ++++++++++++++++ .../contextBean/application.properties | 1 + .../src/test/resources/contextBean/flow.xml | 7 ++++ 11 files changed, 167 insertions(+), 23 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/ContextBeanSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/context/TestContext.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/flow.xml diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java index 283de4216..2ed37eeee 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java @@ -280,6 +280,10 @@ public abstract class NodeComponent { return this.getSlot().getContextBean(contextBeanClazz); } + public T getContextBean(String contextName) { + return this.getSlot().getContextBean(contextName); + } + public String getNodeId() { return nodeId; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/LiteflowResponse.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/LiteflowResponse.java index c2645a299..51e1ddc28 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/LiteflowResponse.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/LiteflowResponse.java @@ -101,6 +101,10 @@ public class LiteflowResponse { return this.getSlot().getContextBean(contextBeanClazz); } + public T getContextBean(String contextName) { + return this.getSlot().getContextBean(contextName); + } + public Map> getExecuteSteps() { Map> map = new LinkedHashMap<>(); this.getSlot().getExecuteSteps().forEach(cmpStep -> { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java index 0f4be12dd..713a0e39e 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java @@ -54,17 +54,7 @@ public abstract class ScriptExecutor { // key的规则为自定义上下文的simpleName // 比如你的自定义上下文为AbcContext,那么key就为:abcContext // 这里不统一放一个map的原因是考虑到有些用户会调用上下文里的方法,而不是参数,所以脚本语言的绑定表里也是放多个上下文 - DataBus.getContextBeanList(wrap.getSlotIndex()).forEach(o -> { - ContextBean contextBean = AnnoUtil.getAnnotation(o.getClass(), ContextBean.class); - String key; - if (contextBean != null && contextBean.value().trim().length() > 0) { - key = contextBean.value(); - } - else { - key = StrUtil.lowerFirst(o.getClass().getSimpleName()); - } - putConsumer.accept(key, o); - }); + DataBus.getContextBeanList(wrap.getSlotIndex()).forEach(tuple -> putConsumer.accept(tuple.get(0), tuple.get(1))); // 把wrap对象转换成元数据map Map metaMap = BeanUtil.beanToMap(wrap); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/DataBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/DataBus.java index 3b2d6b1dd..00e3032e6 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/DataBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/DataBus.java @@ -7,10 +7,14 @@ */ package com.yomahub.liteflow.slot; +import cn.hutool.core.lang.Tuple; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.annotation.util.AnnoUtil; +import com.yomahub.liteflow.context.ContextBean; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.property.LiteflowConfig; @@ -74,13 +78,22 @@ public class DataBus { .map((Function, Object>) ReflectUtil::newInstanceIfPossible) .collect(Collectors.toList()); - Slot slot = new Slot(contextBeanList); - - return offerIndex(slot); + return offerSlotByBean(contextBeanList); } public static int offerSlotByBean(List contextList) { - Slot slot = new Slot(contextList); + List contextBeanList = contextList.stream().map(object -> { + ContextBean contextBean = AnnoUtil.getAnnotation(object.getClass(), ContextBean.class); + String contextKey; + if (contextBean != null && StrUtil.isNotBlank(contextBean.value())){ + contextKey = contextBean.value(); + }else{ + contextKey = StrUtil.lowerFirst(object.getClass().getSimpleName()); + } + return new Tuple(contextKey, object); + }).collect(Collectors.toList()); + + Slot slot = new Slot(contextBeanList); return offerIndex(slot); } @@ -128,7 +141,7 @@ public class DataBus { return SLOTS.get(slotIndex); } - public static List getContextBeanList(int slotIndex) { + public static List getContextBeanList(int slotIndex) { Slot slot = getSlot(slotIndex); return slot.getContextBeanList(); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java index e8cbb8cba..8bb39dafe 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java @@ -9,6 +9,7 @@ package com.yomahub.liteflow.slot; import cn.hutool.core.collection.ConcurrentHashSet; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.lang.Tuple; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.ttl.TransmittableThreadLocal; @@ -30,6 +31,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.function.Predicate; /** * Slot的抽象类实现 @@ -91,14 +93,14 @@ public class Slot { protected ConcurrentHashMap metaDataMap = new ConcurrentHashMap<>(); - private List contextBeanList; + private List contextBeanList; private static final TransmittableThreadLocal> conditionStack = TransmittableThreadLocal.withInitial(ConcurrentLinkedDeque::new); public Slot() { } - public Slot(List contextBeanList) { + public Slot(List contextBeanList) { this.contextBeanList = contextBeanList; } @@ -449,21 +451,30 @@ public class Slot { metaDataMap.remove(SUB_EXCEPTION_PREFIX + chainId); } - public List getContextBeanList() { + public List getContextBeanList() { return this.contextBeanList; } public T getContextBean(Class contextBeanClazz) { - T t = (T) contextBeanList.stream().filter(o -> o.getClass().getName().equals(contextBeanClazz.getName())).findFirst().orElse(null); - if (t == null) { + Tuple contextTuple = contextBeanList.stream().filter(tuple -> tuple.get(1).getClass().getName().equals(contextBeanClazz.getName())).findFirst().orElse(null); + if (contextTuple == null) { contextBeanList.forEach(o -> LOG.info("ChainId[{}], Context class:{},Request class:{}", this.getChainId(), o.getClass().getName(), contextBeanClazz.getName())); throw new NoSuchContextBeanException("this type is not in the context type passed in"); } - return t; + return contextTuple.get(1); + } + + public T getContextBean(String contextBeanKey) { + Tuple contextTuple = contextBeanList.stream().filter(tuple -> tuple.get(0).equals(contextBeanKey)).findFirst().orElse(null); + if (contextTuple == null) { + contextBeanList.forEach(o -> LOG.info("ChainId[{}], Context class:{},Request contextBeanKey:{}", this.getChainId(), o.getClass().getName(), contextBeanKey)); + throw new NoSuchContextBeanException("this context key is not defined"); + } + return contextTuple.get(1); } public T getFirstContextBean() { - Class firstContextBeanClazz = (Class) this.getContextBeanList().get(0).getClass(); + Class firstContextBeanClazz = (Class) this.getContextBeanList().get(0).get(1).getClass(); return this.getContextBean(firstContextBeanClazz); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/ContextBeanSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/ContextBeanSpringbootTest.java new file mode 100644 index 000000000..55567ea7e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/ContextBeanSpringbootTest.java @@ -0,0 +1,38 @@ +package com.yomahub.liteflow.test.contextBean; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import com.yomahub.liteflow.test.contextBean.context.TestContext; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +/** + * ContextBean测试 + * + * @author Bryan.Zhang + */ +@TestPropertySource(value = "classpath:/contextBean/application.properties") +@SpringBootTest(classes = ContextBeanSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.contextBean.cmp" }) +public class ContextBeanSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 最简单的情况 + @Test + public void testContextBean1() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg", TestContext.class); + Assertions.assertTrue(response.isSuccess()); + TestContext context = response.getContextBean("skuContext"); + Assertions.assertEquals("J001", context.getSkuCode()); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/ACmp.java new file mode 100644 index 000000000..45119e9d9 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/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.contextBean.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.test.contextBean.context.TestContext; +import org.springframework.stereotype.Component; + +@Component("a") +public class ACmp extends NodeComponent { + + @Override + public void process() { + TestContext context = this.getContextBean("skuContext"); + context.setSkuCode("J001"); + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/BCmp.java new file mode 100644 index 000000000..1e8c6d1b1 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/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.contextBean.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-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/context/TestContext.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/context/TestContext.java new file mode 100644 index 000000000..9f83e3b39 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/context/TestContext.java @@ -0,0 +1,32 @@ +package com.yomahub.liteflow.test.contextBean.context; + +import com.yomahub.liteflow.context.ContextBean; + +@ContextBean("skuContext") +public class TestContext { + + private String skuCode; + + private String skuName; + + public TestContext(String skuCode, String skuName) { + this.skuCode = skuCode; + this.skuName = skuName; + } + + public String getSkuCode() { + return skuCode; + } + + public void setSkuCode(String skuCode) { + this.skuCode = skuCode; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/application.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/application.properties new file mode 100644 index 000000000..5b68813b3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=contextBean/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/flow.xml new file mode 100644 index 000000000..84d650db4 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/flow.xml @@ -0,0 +1,7 @@ + + + + + THEN(a,b); + + \ No newline at end of file