mirror of
https://gitee.com/dromara/liteFlow.git
synced 2026-05-14 20:22:07 +08:00
feature #I8MW6Q 调整代码
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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())) {
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user