From b858dacdcca8a07e24655f23f0dec30448d590f8 Mon Sep 17 00:00:00 2001 From: Dale Lee <1658850308@qq.com> Date: Mon, 25 Dec 2023 20:18:03 +0800 Subject: [PATCH] =?UTF-8?q?feature=20#I8MW6Q=20=E8=B0=83=E6=95=B4=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/flow/FlowBus.java | 18 +++------ .../script/jsr223/JSR223ScriptExecutor.java | 8 +++- .../graaljs/GraalJavaScriptExecutor.java | 6 +++ .../liteflow/script/java/JavaExecutor.java | 20 ++++++++++ .../remove/LiteFlowJsScriptRemoveELTest.java | 39 ++----------------- 5 files changed, 43 insertions(+), 48 deletions(-) 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 7047fb52b..9e8c9e8c7 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 @@ -300,20 +300,14 @@ public class FlowBus { // 移除节点 public static boolean removeNode(String nodeId) { - Node node = getNode(nodeId); - // node 不存在或不是脚本节点 - if (ObjectUtil.isNull(node)) { + if (containNode(nodeId)) { + nodeMap.remove(nodeId); + return true; + } else { + String errMsg = StrUtil.format("cannot find the node[{}]", nodeId); + LOG.error(errMsg); return false; } - // 移除 node - nodeMap.remove(nodeId); - // 如果是脚本节点,移除脚本 - if (node.getType().isScript()) { - ScriptExecutorFactory.loadInstance() - .getScriptExecutor(node.getLanguage()) - .unLoad(nodeId); - } - return true; } // 判断是否是降级组件,如果是则添加到 fallbackNodeMap 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 515837633..7141bffc6 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,7 @@ package com.yomahub.liteflow.script.jsr223; import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.script.ScriptExecuteWrap; @@ -42,17 +43,22 @@ public abstract class JSR223ScriptExecutor extends ScriptExecutor { try { CompiledScript compiledScript = ((Compilable) scriptEngine).compile(convertScript(script)); compiledScriptMap.put(nodeId, compiledScript); + // 更新 node + if (FlowBus.containNode(nodeId)) { + FlowBus.getNode(nodeId).setScript(script); + } } catch (Exception e) { String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); throw new ScriptLoadException(errorMsg); } - } @Override public void unLoad(String nodeId) { compiledScriptMap.remove(nodeId); + // 移除节点 + FlowBus.removeNode(nodeId); } @Override 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 24260e630..1d8d7b1d5 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 @@ -40,6 +40,10 @@ public class GraalJavaScriptExecutor extends ScriptExecutor { try { String wrapScript = StrUtil.format("function process(){{}} process();", script); scriptMap.put(nodeId, Source.create("js", wrapScript)); + // 更新 node + if (FlowBus.containNode(nodeId)) { + FlowBus.getNode(nodeId).setScript(script); + } } catch (Exception e) { String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); @@ -50,6 +54,8 @@ public class GraalJavaScriptExecutor extends ScriptExecutor { @Override public void unLoad(String nodeId) { scriptMap.remove(nodeId); + // 移除节点 + FlowBus.removeNode(nodeId); } @Override diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java index b0693fda4..7154a2fe6 100644 --- a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java +++ b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java @@ -3,6 +3,7 @@ package com.yomahub.liteflow.script.java; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.script.ScriptExecuteWrap; import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.body.JaninoCommonScriptBody; @@ -10,6 +11,9 @@ import com.yomahub.liteflow.script.exception.ScriptLoadException; import com.yomahub.liteflow.util.CopyOnWriteHashMap; import org.codehaus.commons.compiler.CompilerFactoryFactory; import org.codehaus.commons.compiler.IScriptEvaluator; + +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class JavaExecutor extends ScriptExecutor { @@ -25,6 +29,10 @@ public class JavaExecutor extends ScriptExecutor { se.setParameters(new String[] {"_meta"}, new Class[] {ScriptExecuteWrap.class}); se.cook(convertScript(script)); compiledScriptMap.put(nodeId, se); + // 更新 node + if (FlowBus.containNode(nodeId)) { + FlowBus.getNode(nodeId).setScript(script); + } }catch (Exception e){ String errorMsg = StrUtil.format("script loading error for node[{}],error msg:{}", nodeId, e.getMessage()); throw new ScriptLoadException(errorMsg); @@ -32,6 +40,18 @@ public class JavaExecutor extends ScriptExecutor { } + @Override + public void unLoad(String nodeId) { + compiledScriptMap.remove(nodeId); + // 移除节点 + FlowBus.removeNode(nodeId); + } + + @Override + public List getNodeIds() { + return new ArrayList<>(compiledScriptMap.keySet()); + } + @Override public Object executeScript(ScriptExecuteWrap wrap) throws Exception { if (!compiledScriptMap.containsKey(wrap.getNodeId())) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java index c593e6b3d..6e0491c3c 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java @@ -16,7 +16,6 @@ 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.context.annotation.ComponentScan; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -37,13 +36,10 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { @Resource private FlowExecutor flowExecutor; - private final ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() - .getScriptExecutor(ScriptTypeEnum.JS.getDisplayName()); - - // 仅卸载脚本 @Test public void testUnload() { - flowExecutor.reloadRule(); + ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.JS.getDisplayName()); // 获取节点id List nodeIds = scriptExecutor.getNodeIds(); @@ -66,35 +62,8 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { // 脚本已卸载 Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); - } - - // 卸载节点和脚本 - @Test - public void testRemove() { - flowExecutor.reloadRule(); - - // 保证脚本可以正常运行 - LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); - Assertions.assertTrue(response.isSuccess()); - DefaultContext context = response.getFirstContextBean(); - Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); - - // 卸载节点 - FlowBus.removeNode("s2"); - - // 旧 chain 报脚本加载错误 - response = flowExecutor.execute2Resp("chain2", "arg"); - Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); - - // 新 chian 会找不到节点 - Assertions.assertThrows(ELParseException.class, - () -> LiteFlowChainELBuilder.createChain().setChainId("chain3").setEL( - "THEN(s2)" - ).build()); - // 节点已卸载 - Assertions.assertFalse(FlowBus.containNode("s2")); - // 脚本已卸载 - Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + Assertions.assertFalse(FlowBus.containNode("s1")); + Assertions.assertFalse(FlowBus.removeNode("s1")); } }