diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index 32bed7912..6cc9b609d 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -24,6 +24,7 @@ import com.yomahub.liteflow.exception.NullNodeTypeException; import com.yomahub.liteflow.flow.element.Chain; import com.yomahub.liteflow.flow.element.Condition; import com.yomahub.liteflow.flow.element.Node; +import com.yomahub.liteflow.lifecycle.LifeCycleHolder; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.parser.el.LocalJsonFlowELParser; @@ -91,6 +92,10 @@ public class FlowBus { // 这个方法主要用于第二阶段的替换chain public static void addChain(Chain chain) { chainMap.put(chain.getChainId(), chain); + //如果有生命周期则执行相应生命周期实现 + LifeCycleHolder.getPostProcessAfterChainBuildLifeCycleList().forEach( + postProcessAfterChainBuildLifeCycle -> postProcessAfterChainBuildLifeCycle.postProcessAfterChainBuild(chain) + ); } public static boolean containChain(String chainId) { @@ -125,7 +130,7 @@ public class FlowBus { Node node = new Node(ComponentInitializer.loadInstance() .initComponent(nodeComponent, type, nodeComponent.getName(), nodeId)); - nodeMap.put(nodeId, node); + put2NodeMap(nodeId, node); addFallbackNode(node); } @@ -229,7 +234,7 @@ public class FlowBus { } String activeNodeId = StrUtil.isEmpty(cmpInstance.getNodeId()) ? nodeId : cmpInstance.getNodeId(); - nodeMap.put(activeNodeId, node); + put2NodeMap(activeNodeId, node); addFallbackNode(node); } } @@ -368,4 +373,12 @@ public class FlowBus { initStat.set(false); } + private static void put2NodeMap(String nodeId, Node node){ + nodeMap.put(nodeId, node); + // 如果有生命周期则执行相应生命周期实现 + LifeCycleHolder.getPostProcessAfterNodeBuildLifeCycleList().forEach( + postProcessAfterNodeBuildLifeCycle -> postProcessAfterNodeBuildLifeCycle.postProcessAfterNodeBuild(node) + ); + } + } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/LifeCycle.java b/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/LifeCycle.java new file mode 100644 index 000000000..177331043 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/LifeCycle.java @@ -0,0 +1,11 @@ +package com.yomahub.liteflow.lifecycle; + +/** + * 生命周期接口 + * 主要作为标识接口 + * + * @author Bryan.Zhang + * @since 2.12.4 + */ +public interface LifeCycle { +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/LifeCycleHolder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/LifeCycleHolder.java new file mode 100644 index 000000000..0202147d2 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/LifeCycleHolder.java @@ -0,0 +1,43 @@ +package com.yomahub.liteflow.lifecycle; + +import java.util.ArrayList; +import java.util.List; + +/** + * 生命周期接口持有器 + * 经过启动后把相应的生命周期接口实现类扫入这个持有器中 + * + * @author Bryan.Zhang + * @since 2.12.4 + */ +public class LifeCycleHolder { + + private static final List postProcessAfterScriptEngineInitLifeCycleList = new ArrayList<>(); + + private static final List postProcessAfterChainBuildLifeCycleList = new ArrayList<>(); + + private static final List postProcessAfterNodeBuildLifeCycleList = new ArrayList<>(); + + + public static void addLifeCycle(LifeCycle lifeCycle){ + if (PostProcessAfterScriptEngineInitLifeCycle.class.isAssignableFrom(lifeCycle.getClass())){ + postProcessAfterScriptEngineInitLifeCycleList.add((PostProcessAfterScriptEngineInitLifeCycle)lifeCycle); + }else if(PostProcessAfterChainBuildLifeCycle.class.isAssignableFrom(lifeCycle.getClass())){ + postProcessAfterChainBuildLifeCycleList.add((PostProcessAfterChainBuildLifeCycle)lifeCycle); + }else if(PostProcessAfterNodeBuildLifeCycle.class.isAssignableFrom(lifeCycle.getClass())){ + postProcessAfterNodeBuildLifeCycleList.add((PostProcessAfterNodeBuildLifeCycle)lifeCycle); + } + } + + public static List getPostProcessAfterScriptEngineInitLifeCycleList() { + return postProcessAfterScriptEngineInitLifeCycleList; + } + + public static List getPostProcessAfterChainBuildLifeCycleList() { + return postProcessAfterChainBuildLifeCycleList; + } + + public static List getPostProcessAfterNodeBuildLifeCycleList() { + return postProcessAfterNodeBuildLifeCycleList; + } +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterChainBuildLifeCycle.java b/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterChainBuildLifeCycle.java new file mode 100644 index 000000000..305c6716a --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterChainBuildLifeCycle.java @@ -0,0 +1,15 @@ +package com.yomahub.liteflow.lifecycle; + +import com.yomahub.liteflow.flow.element.Chain; + +/** + * 生命周期接口 + * 在Chain构造后执行,如果有实现的话 + * + * @author Bryan.Zhang + * @since 2.12.4 + */ +public interface PostProcessAfterChainBuildLifeCycle extends LifeCycle { + + void postProcessAfterChainBuild(Chain chain); +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterNodeBuildLifeCycle.java b/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterNodeBuildLifeCycle.java new file mode 100644 index 000000000..763bbb660 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterNodeBuildLifeCycle.java @@ -0,0 +1,15 @@ +package com.yomahub.liteflow.lifecycle; + +import com.yomahub.liteflow.flow.element.Node; + +/** + * 生命周期接口 + * 在Node构造后执行,如果有实现的话 + * + * @author Bryan.Zhang + * @since 2.12.4 + */ +public interface PostProcessAfterNodeBuildLifeCycle extends LifeCycle { + + void postProcessAfterNodeBuild(Node node); +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterScriptEngineInitLifeCycle.java b/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterScriptEngineInitLifeCycle.java new file mode 100644 index 000000000..2122bbe07 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterScriptEngineInitLifeCycle.java @@ -0,0 +1,13 @@ +package com.yomahub.liteflow.lifecycle; + +/** + * 生命周期接口 + * 在初始化Script执行器后执行,如果有实现的话 + * + * @author Bryan.Zhang + * @since 2.12.4 + */ +public interface PostProcessAfterScriptEngineInitLifeCycle extends LifeCycle{ + + void postProcessAfterScriptEngineInit(Object engine); +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserProvider.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserProvider.java index 969b6405d..cbf00c15c 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserProvider.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserProvider.java @@ -33,7 +33,7 @@ import static com.yomahub.liteflow.parser.factory.FlowParserProvider.ConfigRegex */ public class FlowParserProvider { - private static final LFLog LOG = LFLoggerManager.getLogger(FlowExecutor.class); + private static final LFLog LOG = LFLoggerManager.getLogger(FlowParserProvider.class); private static final FlowParserFactory LOCAL_PARSER_FACTORY = new LocalParserFactory(); 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 45702c7cb..89eb9ef9f 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 @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.exception.LiteFlowException; +import com.yomahub.liteflow.lifecycle.LifeCycleHolder; import com.yomahub.liteflow.slot.DataBus; import com.yomahub.liteflow.slot.Slot; @@ -20,9 +21,16 @@ import java.util.function.BiConsumer; public abstract class ScriptExecutor { public ScriptExecutor init(){ + lifeCycle(null); return this; } + public void lifeCycle(Object engine){ + LifeCycleHolder.getPostProcessAfterScriptEngineInitLifeCycleList().forEach( + postProcessAfterScriptEngineInitLifeCycle -> postProcessAfterScriptEngineInitLifeCycle.postProcessAfterScriptEngineInit(engine) + ); + } + public abstract void load(String nodeId, String script); // 卸载脚本(不包含 node) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java index 4fd1cf69f..32a50e99f 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java @@ -1,6 +1,8 @@ package com.yomahub.liteflow.script.jsr223; import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.lifecycle.LifeCycleHolder; +import com.yomahub.liteflow.lifecycle.PostProcessAfterScriptEngineInitLifeCycle; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.script.ScriptExecuteWrap; @@ -18,6 +20,7 @@ import javax.script.ScriptException; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; /** * JSR223 script engine的统一实现抽象类 @@ -37,6 +40,10 @@ public abstract class JSR223ScriptExecutor extends ScriptExecutor { public ScriptExecutor init() { ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); scriptEngine = scriptEngineManager.getEngineByName(this.scriptType().getEngineName()); + + //如果有生命周期则执行相应生命周期实现 + super.lifeCycle(scriptEngine); + return this; } diff --git a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java index 844d75133..f249d5f00 100644 --- a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java @@ -2,6 +2,7 @@ package com.yomahub.liteflow.script.graaljs; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.lifecycle.LifeCycleHolder; import com.yomahub.liteflow.script.ScriptExecuteWrap; import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.exception.ScriptLoadException; @@ -30,6 +31,8 @@ public class GraalJavaScriptExecutor extends ScriptExecutor { @Override public ScriptExecutor init() { engine = Engine.create(); + //如果有生命周期则执行相应生命周期实现 + super.lifeCycle(engine); return this; } diff --git a/liteflow-script-plugin/liteflow-script-javax/src/main/java/com/yomahub/liteflow/script/javax/JavaxExecutor.java b/liteflow-script-plugin/liteflow-script-javax/src/main/java/com/yomahub/liteflow/script/javax/JavaxExecutor.java index 785ab8817..24a0a94a8 100644 --- a/liteflow-script-plugin/liteflow-script-javax/src/main/java/com/yomahub/liteflow/script/javax/JavaxExecutor.java +++ b/liteflow-script-plugin/liteflow-script-javax/src/main/java/com/yomahub/liteflow/script/javax/JavaxExecutor.java @@ -33,6 +33,8 @@ public class JavaxExecutor extends ScriptExecutor { LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); String isCacheValue = liteflowConfig.getScriptSetting().get(JavaxSettingMapKey.IS_CACHE); isCache = Boolean.parseBoolean(isCacheValue); + //如果有生命周期则执行相应生命周期实现 + super.lifeCycle(null); return this; } diff --git a/liteflow-script-plugin/liteflow-script-python/src/main/java/com/yomahub/liteflow/script/python/PythonScriptExecutor.java b/liteflow-script-plugin/liteflow-script-python/src/main/java/com/yomahub/liteflow/script/python/PythonScriptExecutor.java index 9ceb333df..53e5b00a0 100644 --- a/liteflow-script-plugin/liteflow-script-python/src/main/java/com/yomahub/liteflow/script/python/PythonScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-python/src/main/java/com/yomahub/liteflow/script/python/PythonScriptExecutor.java @@ -33,6 +33,8 @@ public class PythonScriptExecutor extends ScriptExecutor { PySystemState systemState = new PySystemState(); systemState.setdefaultencoding("UTF-8"); this.pythonInterpreter = new PythonInterpreter(null, systemState); + //如果有生命周期则执行相应生命周期实现 + super.lifeCycle(pythonInterpreter); return this; } diff --git a/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java b/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java index eacf3c38c..66a86beac 100644 --- a/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java @@ -37,6 +37,8 @@ public class QLExpressScriptExecutor extends ScriptExecutor { @Override public ScriptExecutor init() { expressRunner = new ExpressRunner(true, false); + //如果有生命周期则执行相应生命周期实现 + super.lifeCycle(expressRunner); return this; } diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java index 2398202a6..514acbf4c 100644 --- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java +++ b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java @@ -1,6 +1,7 @@ package com.yomahub.liteflow.solon.config; import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.property.LiteflowConfig; import org.noear.solon.annotation.Configuration; import org.noear.solon.annotation.Init; @@ -37,6 +38,7 @@ public class LiteflowMainAutoConfiguration { if (parseOnStart) { flowExecutor.init(true); + FlowBus.needInit(); } appContext.wrapAndPut(FlowExecutor.class, flowExecutor); diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/integration/XPluginImpl.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/integration/XPluginImpl.java index 282ed403b..db3c8156d 100644 --- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/integration/XPluginImpl.java +++ b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/integration/XPluginImpl.java @@ -6,6 +6,8 @@ import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.core.proxy.DeclWarpBean; import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil; import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.lifecycle.LifeCycle; +import com.yomahub.liteflow.lifecycle.LifeCycleHolder; import com.yomahub.liteflow.solon.config.LiteflowAutoConfiguration; import com.yomahub.liteflow.solon.config.LiteflowMainAutoConfiguration; import com.yomahub.liteflow.solon.config.LiteflowMonitorProperty; @@ -46,11 +48,16 @@ public class XPluginImpl implements Plugin { context.beanMake(LiteflowAutoConfiguration.class); context.beanMake(LiteflowMainAutoConfiguration.class); + // 订阅生命周期实现类 + context.subWrapsOfType(LifeCycle.class, bw -> { + LifeCycle lifeCycle = bw.raw(); + LifeCycleHolder.addLifeCycle(lifeCycle); + }); + // 订阅 NodeComponent 组件 context.subWrapsOfType(NodeComponent.class, bw -> { NodeComponent node1 = bw.raw(); node1.setNodeId(bw.name()); - FlowBus.addManagedNode(bw.name(), bw.raw()); }); diff --git a/liteflow-spring/src/main/java/com/yomahub/liteflow/process/LiteflowScannerProcessStepFactory.java b/liteflow-spring/src/main/java/com/yomahub/liteflow/process/LiteflowScannerProcessStepFactory.java index d8222725f..25979b1ea 100644 --- a/liteflow-spring/src/main/java/com/yomahub/liteflow/process/LiteflowScannerProcessStepFactory.java +++ b/liteflow-spring/src/main/java/com/yomahub/liteflow/process/LiteflowScannerProcessStepFactory.java @@ -15,7 +15,7 @@ import java.util.List; * @since 2.12.4 */ public class LiteflowScannerProcessStepFactory { - private static final List SPRING_BEAN_FINDER = new ArrayList<>(); + private static final List SCANNER_PROCESS_STEP_LIST = new ArrayList<>(); public LiteflowScannerProcessStepFactory() { // 初始化 @@ -27,14 +27,15 @@ public class LiteflowScannerProcessStepFactory { * 该方法用于向Spring Bean查找器集合中添加各种不同类型的Bean查找器,并按照它们的优先级进行排序 */ private void register() { - SPRING_BEAN_FINDER.add(new CmpAroundAspectBeanProcess()); - SPRING_BEAN_FINDER.add(new DeclWarpBeanProcess()); - SPRING_BEAN_FINDER.add(new NodeCmpBeanProcess()); - SPRING_BEAN_FINDER.add(new ScriptBeanProcess()); - SPRING_BEAN_FINDER.add(new ScriptMethodBeanProcess()); + SCANNER_PROCESS_STEP_LIST.add(new CmpAroundAspectBeanProcess()); + SCANNER_PROCESS_STEP_LIST.add(new DeclWarpBeanProcess()); + SCANNER_PROCESS_STEP_LIST.add(new NodeCmpBeanProcess()); + SCANNER_PROCESS_STEP_LIST.add(new ScriptBeanProcess()); + SCANNER_PROCESS_STEP_LIST.add(new ScriptMethodBeanProcess()); + SCANNER_PROCESS_STEP_LIST.add(new LifeCycleBeanProcess()); // 按优先级排序 - CollUtil.sort(SPRING_BEAN_FINDER, Comparator.comparing(o -> o.type().getPriority())); + CollUtil.sort(SCANNER_PROCESS_STEP_LIST, Comparator.comparing(o -> o.type().getPriority())); } /** @@ -44,6 +45,6 @@ public class LiteflowScannerProcessStepFactory { * 用于查找和实例化Spring Beans */ public Collection getSteps() { - return CollUtil.unmodifiable(SPRING_BEAN_FINDER); + return CollUtil.unmodifiable(SCANNER_PROCESS_STEP_LIST); } } diff --git a/liteflow-spring/src/main/java/com/yomahub/liteflow/process/enums/LiteflowScannerProcessStepEnum.java b/liteflow-spring/src/main/java/com/yomahub/liteflow/process/enums/LiteflowScannerProcessStepEnum.java index 32cae6904..e1a7ab217 100644 --- a/liteflow-spring/src/main/java/com/yomahub/liteflow/process/enums/LiteflowScannerProcessStepEnum.java +++ b/liteflow-spring/src/main/java/com/yomahub/liteflow/process/enums/LiteflowScannerProcessStepEnum.java @@ -7,12 +7,13 @@ package com.yomahub.liteflow.process.enums; * @since 2.12.4 */ public enum LiteflowScannerProcessStepEnum { - DECL_WARP_BEAN("声明式组件", Integer.MIN_VALUE), - NODE_CMP_BEAN("普通组件", Integer.MIN_VALUE + 10), - CMP_AROUND_ASPECT_BEAN("组件Aop的实现类", Integer.MIN_VALUE + 20), - SCRIPT_BEAN("@ScriptBean修饰的类", Integer.MIN_VALUE + 30), - SCRIPT_METHOD_BEAN("@ScriptMethod修饰的类", Integer.MIN_VALUE + 40), - DATA_BASE_CONNECT_BEAN("sql 插件数据库连接获取", Integer.MIN_VALUE + 50), + DECL_WARP_BEAN("声明式组件", 1), + NODE_CMP_BEAN("普通组件", 2), + CMP_AROUND_ASPECT_BEAN("组件Aop的实现类", 3), + SCRIPT_BEAN("@ScriptBean修饰的类", 4), + SCRIPT_METHOD_BEAN("@ScriptMethod修饰的类", 5), + DATA_BASE_CONNECT_BEAN("sql 插件数据库连接获取", 6), + LIFE_CYCLE_BEAN("生命周期实现类", 7) ; private final String desc; private final Integer priority; diff --git a/liteflow-spring/src/main/java/com/yomahub/liteflow/process/impl/LifeCycleBeanProcess.java b/liteflow-spring/src/main/java/com/yomahub/liteflow/process/impl/LifeCycleBeanProcess.java new file mode 100644 index 000000000..2938f2bf1 --- /dev/null +++ b/liteflow-spring/src/main/java/com/yomahub/liteflow/process/impl/LifeCycleBeanProcess.java @@ -0,0 +1,33 @@ +package com.yomahub.liteflow.process.impl; + +import com.yomahub.liteflow.lifecycle.LifeCycle; +import com.yomahub.liteflow.lifecycle.LifeCycleHolder; +import com.yomahub.liteflow.process.LiteflowScannerProcessStep; +import com.yomahub.liteflow.process.context.LiteflowScannerProcessStepContext; +import com.yomahub.liteflow.process.enums.LiteflowScannerProcessStepEnum; + +/** + * 生命周期Bean的查找和初始化 + * + * @author Bryan.Zhang + * @since 2.12.4 + */ +public class LifeCycleBeanProcess implements LiteflowScannerProcessStep { + @Override + public boolean filter(LiteflowScannerProcessStepContext ctx) { + Object bean = ctx.getBean(); + return bean instanceof LifeCycle; + } + + @Override + public Object postProcessAfterInitialization(LiteflowScannerProcessStepContext ctx) { + Object bean = ctx.getBean(); + LifeCycleHolder.addLifeCycle((LifeCycle) bean); + return bean; + } + + @Override + public LiteflowScannerProcessStepEnum type() { + return LiteflowScannerProcessStepEnum.LIFE_CYCLE_BEAN; + } +} diff --git a/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java b/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java index 1fb352f07..3881649fa 100644 --- a/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java +++ b/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java @@ -30,18 +30,14 @@ import java.util.Optional; public class ComponentScanner implements BeanPostProcessor { private static final Logger LOG = LoggerFactory.getLogger(ComponentScanner.class); - private LiteflowConfig liteflowConfig; - private final LiteflowScannerProcessStepFactory liteflowScannerProcessStepFactory; + private final LiteflowScannerProcessStepFactory liteflowScannerProcessStepFactory = new LiteflowScannerProcessStepFactory(); public ComponentScanner() { - this.liteflowScannerProcessStepFactory = new LiteflowScannerProcessStepFactory(); LOGOPrinter.print(); } public ComponentScanner(LiteflowConfig liteflowConfig) { - this.liteflowConfig = liteflowConfig; - this.liteflowScannerProcessStepFactory = new LiteflowScannerProcessStepFactory(); if (liteflowConfig.getPrintBanner()) { // 打印liteflow的LOGO LOGOPrinter.print(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/LifeCycleSolonTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/LifeCycleSolonTest.java new file mode 100644 index 000000000..7ed26d1ac --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/LifeCycleSolonTest.java @@ -0,0 +1,30 @@ +package com.yomahub.liteflow.test.lifecycle; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.noear.solon.annotation.Import; +import org.noear.solon.annotation.Inject; +import org.noear.solon.test.SolonTest; + +/** + * 生命周期例子 + * + * @author Bryan.Zhang + */ +@SolonTest +@Import(profiles="classpath:/lifecycle/application.properties") +public class LifeCycleSolonTest extends BaseTest { + + @Inject + private FlowExecutor flowExecutor; + + // 最简单的情况 + @Test + public void testLifeCycle() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/ACmp.java new file mode 100644 index 000000000..44a79ea85 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/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.lifecycle.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.noear.solon.annotation.Component; + +@Component("a") +public class ACmp extends NodeComponent { + + @Override + public void process() { + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/BCmp.java new file mode 100644 index 000000000..ee76d8241 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/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.lifecycle.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.noear.solon.annotation.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-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/CCmp.java new file mode 100644 index 000000000..88c19a83c --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/CCmp.java @@ -0,0 +1,20 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.lifecycle.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.noear.solon.annotation.Component; + +@Component("c") +public class CCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/DCmp.java new file mode 100644 index 000000000..7d4316b19 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/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.lifecycle.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.noear.solon.annotation.Component; + +@Component("d") +public class DCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("DCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestChainLifeCycle.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestChainLifeCycle.java new file mode 100644 index 000000000..54b5f3250 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestChainLifeCycle.java @@ -0,0 +1,14 @@ +package com.yomahub.liteflow.test.lifecycle.impl; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.flow.element.Chain; +import com.yomahub.liteflow.lifecycle.PostProcessAfterChainBuildLifeCycle; +import org.noear.solon.annotation.Component; + +@Component +public class TestChainLifeCycle implements PostProcessAfterChainBuildLifeCycle { + @Override + public void postProcessAfterChainBuild(Chain chain) { + System.out.println(StrUtil.format("Chain生命周期——[{}]已被加载",chain.getChainId())); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestNodeLifeCycle.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestNodeLifeCycle.java new file mode 100644 index 000000000..aea25b033 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestNodeLifeCycle.java @@ -0,0 +1,14 @@ +package com.yomahub.liteflow.test.lifecycle.impl; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.flow.element.Node; +import com.yomahub.liteflow.lifecycle.PostProcessAfterNodeBuildLifeCycle; +import org.noear.solon.annotation.Component; + +@Component +public class TestNodeLifeCycle implements PostProcessAfterNodeBuildLifeCycle { + @Override + public void postProcessAfterNodeBuild(Node node) { + System.out.println(StrUtil.format("Node生命周期——[{}]已被加载",node.getId())); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/lifecycle/application.properties b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/lifecycle/application.properties new file mode 100644 index 000000000..399d25874 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/lifecycle/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=lifecycle/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/lifecycle/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/lifecycle/flow.el.xml new file mode 100644 index 000000000..dfa3185b2 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/lifecycle/flow.el.xml @@ -0,0 +1,11 @@ + + + + + THEN(a,b,c,d); + + + + THEN(d,c,b,a); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/LifeCycleSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/LifeCycleSpringbootTest.java new file mode 100644 index 000000000..8e594a956 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/LifeCycleSpringbootTest.java @@ -0,0 +1,35 @@ +package com.yomahub.liteflow.test.lifecycle; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +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; + +/** + * springboot环境EL常规的例子测试 + * + * @author Bryan.Zhang + */ +@TestPropertySource(value = "classpath:/lifecycle/application.properties") +@SpringBootTest(classes = LifeCycleSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.lifecycle.cmp", "com.yomahub.liteflow.test.lifecycle.impl" }) +public class LifeCycleSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 最简单的情况 + @Test + public void testLifeCycle() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/ACmp.java new file mode 100644 index 000000000..9ef64319c --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/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.lifecycle.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-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/BCmp.java new file mode 100644 index 000000000..f91667b6b --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/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.lifecycle.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/lifecycle/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/CCmp.java new file mode 100644 index 000000000..5485764fe --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/CCmp.java @@ -0,0 +1,20 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.lifecycle.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-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/DCmp.java new file mode 100644 index 000000000..00f349825 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/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.lifecycle.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("DCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestChainLifeCycle.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestChainLifeCycle.java new file mode 100644 index 000000000..e8a071ae3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestChainLifeCycle.java @@ -0,0 +1,14 @@ +package com.yomahub.liteflow.test.lifecycle.impl; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.flow.element.Chain; +import com.yomahub.liteflow.lifecycle.PostProcessAfterChainBuildLifeCycle; +import org.springframework.stereotype.Component; + +@Component +public class TestChainLifeCycle implements PostProcessAfterChainBuildLifeCycle { + @Override + public void postProcessAfterChainBuild(Chain chain) { + System.out.println(StrUtil.format("Chain生命周期——[{}]已被加载",chain.getChainId())); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestNodeLifeCycle.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestNodeLifeCycle.java new file mode 100644 index 000000000..c0e14a487 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestNodeLifeCycle.java @@ -0,0 +1,14 @@ +package com.yomahub.liteflow.test.lifecycle.impl; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.flow.element.Node; +import com.yomahub.liteflow.lifecycle.PostProcessAfterNodeBuildLifeCycle; +import org.springframework.stereotype.Component; + +@Component +public class TestNodeLifeCycle implements PostProcessAfterNodeBuildLifeCycle { + @Override + public void postProcessAfterNodeBuild(Node node) { + System.out.println(StrUtil.format("Node生命周期——[{}]已被加载",node.getId())); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/lifecycle/application.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/lifecycle/application.properties new file mode 100644 index 000000000..399d25874 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/lifecycle/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=lifecycle/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/lifecycle/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/lifecycle/flow.el.xml new file mode 100644 index 000000000..dfa3185b2 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/lifecycle/flow.el.xml @@ -0,0 +1,11 @@ + + + + + THEN(a,b,c,d); + + + + THEN(d,c,b,a); + + \ No newline at end of file