From 639c2f5b3acb55ba56d0ab0486a766c169c31d6f Mon Sep 17 00:00:00 2001 From: DaleLee Date: Sun, 24 May 2026 19:02:09 +0800 Subject: [PATCH] fix #IJM5SE reset startUpPhase when ruleSource is empty to enable script compilation When ruleSource is empty (code-based chain building), FlowExecutor.init() returns early without resetting startUpPhase to false. This causes JavaxProExecutor to keep queuing scripts into codeSpecMap, waiting for the one-time loadSecondPhase() that has already executed, so scripts are never actually compiled into compiledScriptMap. Co-Authored-By: deepseek-v4-pro --- .../yomahub/liteflow/core/FlowExecutor.java | 1 + .../liteflow/test/builder/BuilderTest.java | 7 +++ .../builder/ScriptJavaxProBuilderELTest.java | 60 +++++++++++++++++++ .../resources/builder/application.properties | 1 + .../builder/BuilderELSpringbootTest1.java | 7 +++ .../test/builder/BuilderELSpringTest1.java | 7 +++ 6 files changed, 83 insertions(+) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/builder/ScriptJavaxProBuilderELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/resources/builder/application.properties 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 72643f3e4..398e2b427 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 @@ -130,6 +130,7 @@ public class FlowExecutor { else { // ruleSource为空,而且没有spi形式的扩展,那么说明真的没有ruleSource // 这种情况有可能是基于代码动态构建的 + startUpPhase.compareAndSet(true, false); return; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/builder/BuilderTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/builder/BuilderTest.java index 4f4eaffc6..303b98aec 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/builder/BuilderTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/builder/BuilderTest.java @@ -24,6 +24,13 @@ public class BuilderTest extends BaseTest { flowExecutor = FlowExecutorHolder.loadInstance(config); } + // 验证ruleSource为空时,代码动态构建链后startUpPhase正确为false,确保脚本热更新可用 + @Test + public void testStartUpPhaseWhenRuleSourceEmpty() { + Assertions.assertFalse(flowExecutor.getStartUpPhase().get(), + "当ruleSource为空时,startUpPhase应在init完成后为false"); + } + // 基于普通组件的builder模式测试 @Test public void testBuilder() throws Exception { diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/builder/ScriptJavaxProBuilderELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/builder/ScriptJavaxProBuilderELTest.java new file mode 100644 index 000000000..a944d2a7b --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/builder/ScriptJavaxProBuilderELTest.java @@ -0,0 +1,60 @@ +package com.yomahub.liteflow.test.script.javaxpro.builder; + +import com.yomahub.liteflow.builder.LiteFlowNodeBuilder; +import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.slot.DefaultContext; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = ScriptJavaxProBuilderELTest.class) +@EnableAutoConfiguration +@TestPropertySource(value = "classpath:/builder/application.properties") +public class ScriptJavaxProBuilderELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 验证ruleSource为空时,代码动态构建的脚本节点可被正确编译并执行 + @Test + public void testScriptCompiledWhenRuleSourceEmpty() { + String script = "import com.yomahub.liteflow.core.NodeComponent;\n" + + "import com.yomahub.liteflow.slot.DefaultContext;\n" + + "public class Demo extends NodeComponent {\n" + + " public void process() {\n" + + " DefaultContext ctx = this.getFirstContextBean();\n" + + " ctx.setData(\"scriptExecuted\", true);\n" + + " }\n" + + "}"; + + LiteFlowNodeBuilder.createScriptNode() + .setId("s") + .setName("脚本S") + .setScript(script) + .setLanguage(ScriptTypeEnum.JAVA.getDisplayName()) + .build(); + + LiteFlowChainELBuilder.createChain() + .setChainId("testScriptChain") + .setEL("THEN(s)") + .build(); + + LiteflowResponse response = flowExecutor.execute2Resp("testScriptChain", null, DefaultContext.class); + Assertions.assertTrue(response.isSuccess(), + "链应执行成功"); + DefaultContext ctx = response.getFirstContextBean(); + Assertions.assertEquals(true, ctx.getData("scriptExecuted"), + "脚本应被正确编译并执行"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/resources/builder/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/resources/builder/application.properties new file mode 100644 index 000000000..92dd32295 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/resources/builder/application.properties @@ -0,0 +1 @@ +liteflow.enable=true diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/builder/BuilderELSpringbootTest1.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/builder/BuilderELSpringbootTest1.java index 933f35b62..4d5659b0e 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/builder/BuilderELSpringbootTest1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/builder/BuilderELSpringbootTest1.java @@ -33,6 +33,13 @@ public class BuilderELSpringbootTest1 extends BaseTest { @Resource private FlowExecutor flowExecutor; + // 验证ruleSource为空时,代码动态构建链后startUpPhase正确为false + @Test + public void testStartUpPhaseWhenRuleSourceEmpty() { + Assertions.assertFalse(flowExecutor.getStartUpPhase().get(), + "当ruleSource为空时,startUpPhase应在init完成后为false"); + } + // 基于普通组件的builder模式测试 @Test public void testBuilder() throws Exception { diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/builder/BuilderELSpringTest1.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/builder/BuilderELSpringTest1.java index 4796afc1b..4b0b3fe2b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/builder/BuilderELSpringTest1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/builder/BuilderELSpringTest1.java @@ -31,6 +31,13 @@ public class BuilderELSpringTest1 extends BaseTest { @Resource private FlowExecutor flowExecutor; + // 验证ruleSource为空时,代码动态构建链后startUpPhase正确为false + @Test + public void testStartUpPhaseWhenRuleSourceEmpty() { + Assertions.assertFalse(flowExecutor.getStartUpPhase().get(), + "当ruleSource为空时,startUpPhase应在init完成后为false"); + } + // 基于普通组件的builder模式测试 @Test public void testBuilder() throws Exception { -- Gitee