feature #I8MW6Q 调整代码

This commit is contained in:
Dale Lee
2023-12-25 20:18:03 +08:00
parent c3c72c5cc1
commit b858dacdcc
5 changed files with 43 additions and 48 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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<String> getNodeIds() {
return new ArrayList<>(compiledScriptMap.keySet());
}
@Override
public Object executeScript(ScriptExecuteWrap wrap) throws Exception {
if (!compiledScriptMap.containsKey(wrap.getNodeId())) {

View File

@@ -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<String> 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"));
}
}