Просмотр исходного кода

bug #I4CGL8 QLExpress脚本引擎在refresh脚本节点的时候会失败

bryan31 3 лет назад
Родитель
Сommit
fdc5840a99

+ 1 - 1
liteflow-core/pom.xml

@@ -9,7 +9,7 @@
     <parent>
 		<groupId>com.yomahub</groupId>
 		<artifactId>liteflow</artifactId>
-		<version>2.6.0</version>
+		<version>2.6.1</version>
 	</parent>
 
 	<dependencies>

+ 1 - 1
liteflow-script-common/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>liteflow</artifactId>
         <groupId>com.yomahub</groupId>
-        <version>2.6.0</version>
+        <version>2.6.1</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
liteflow-script-groovy/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>liteflow</artifactId>
         <groupId>com.yomahub</groupId>
-        <version>2.6.0</version>
+        <version>2.6.1</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
liteflow-script-groovy/src/main/java/com/yomahub/liteflow/script/groovy/GroovyScriptExecutor.java

@@ -41,7 +41,7 @@ public class GroovyScriptExecutor implements ScriptExecutor {
                 compiledScriptMap.put(nodeId, compiledScript);
             }
         }catch (Exception e){
-            String errorMsg = StrUtil.format("script loading error for node[{}]", nodeId);
+            String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage());
             throw new ScriptLoadException(errorMsg);
         }
 

+ 1 - 1
liteflow-script-qlexpress/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>liteflow</artifactId>
         <groupId>com.yomahub</groupId>
-        <version>2.6.0</version>
+        <version>2.6.1</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 6 - 2
liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java

@@ -1,7 +1,10 @@
 package com.yomahub.liteflow.script.qlexpress;
 
+import cn.hutool.core.io.resource.ResourceUtil;
+import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.ql.util.express.DefaultContext;
+import com.ql.util.express.ExpressLoader;
 import com.ql.util.express.ExpressRunner;
 import com.yomahub.liteflow.entity.data.DataBus;
 import com.yomahub.liteflow.entity.data.Slot;
@@ -36,7 +39,7 @@ public class QLExpressScriptExecutor implements ScriptExecutor {
         try{
             expressRunner.loadMutilExpress(nodeId, script);
         }catch (Exception e){
-            String errorMsg = StrUtil.format("script loading error for node[{}]", nodeId);
+            String errorMsg = StrUtil.format("script loading error for node[{}],error msg:{}", nodeId, e.getMessage());
             throw new ScriptLoadException(errorMsg);
         }
     }
@@ -46,7 +49,7 @@ public class QLExpressScriptExecutor implements ScriptExecutor {
         List<String> errorList = new ArrayList<>();
         try{
             Slot slot = DataBus.getSlot(slotIndex);
-            DefaultContext<String, Object> context = new DefaultContext<String, Object>();
+            DefaultContext<String, Object> context = new DefaultContext<>();
             context.put("slot", slot);
             return expressRunner.executeByExpressName(nodeId, context, errorList, true, false, null);
         }catch (Exception e){
@@ -61,5 +64,6 @@ public class QLExpressScriptExecutor implements ScriptExecutor {
     @Override
     public void cleanCache() {
         expressRunner.clearExpressCache();
+        ReflectUtil.setFieldValue(expressRunner,"loader",new ExpressLoader(expressRunner));
     }
 }

+ 1 - 1
liteflow-spring-boot-starter/pom.xml

@@ -10,7 +10,7 @@
     <parent>
         <artifactId>liteflow</artifactId>
         <groupId>com.yomahub</groupId>
-        <version>2.6.0</version>
+        <version>2.6.1</version>
     </parent>
 
     <dependencies>

+ 1 - 1
liteflow-testcase-script-groovy/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>liteflow</artifactId>
         <groupId>com.yomahub</groupId>
-        <version>2.6.0</version>
+        <version>2.6.1</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 21 - 0
liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowScriptGroovyTest.java

@@ -1,8 +1,11 @@
 package com.yomahub.liteflow.test.script.groovy;
 
+import cn.hutool.core.io.resource.ResourceUtil;
 import com.yomahub.liteflow.core.FlowExecutor;
 import com.yomahub.liteflow.entity.data.DefaultSlot;
 import com.yomahub.liteflow.entity.data.LiteflowResponse;
+import com.yomahub.liteflow.enums.FlowParserTypeEnum;
+import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.test.BaseTest;
 import org.junit.Assert;
 import org.junit.Test;
@@ -46,4 +49,22 @@ public class LiteflowScriptGroovyTest extends BaseTest {
         Assert.assertTrue(response.isSuccess());
         Assert.assertEquals("d==>s2[条件脚本]==>a", response.getSlot().printStep());
     }
+
+    //测试脚本的热重载
+    @Test
+    public void testScript3() throws Exception{
+        //根据配置,加载的应该是flow.xml,执行原来的规则
+        LiteflowResponse<DefaultSlot> responseOld = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseOld.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本]==>a", responseOld.getSlot().printStep());
+        //更改规则,重新加载,更改的规则内容从flow_update.xml里读取,这里只是为了模拟下获取新的内容。不一定是从文件中读取
+        String newContent = ResourceUtil.readUtf8Str("classpath: /script/flow_update.xml");
+        //进行刷新
+        FlowBus.refreshFlowMetaData(FlowParserTypeEnum.TYPE_XML, newContent);
+
+        //重新执行chain2这个链路,结果会变
+        LiteflowResponse<DefaultSlot> responseNew = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseNew.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本_改]==>b==>s3[普通脚本_新增]", responseNew.getSlot().printStep());
+    }
 }

+ 40 - 0
liteflow-testcase-script-groovy/src/test/resources/script/flow_update.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<flow>
+    <nodes>
+        <node id="s1" name="普通脚本" type="script">
+            <![CDATA[
+                def a=3;
+                def b=2;
+                slot.setData("s1",a*b);
+            ]]>
+        </node>
+
+        <node id="s2" name="条件脚本_改" type="cond_script">
+            <![CDATA[
+                count = slot.getData("count");
+                if(count > 150){
+                    return "b";
+                }else{
+                    return "a";
+                }
+            ]]>
+        </node>
+
+        <node id="s3" name="普通脚本_新增" type="script">
+            <![CDATA[
+                def a=3;
+                def b=2;
+                def c=10;
+                slot.setData("s1",a*b+c);
+            ]]>
+        </node>
+    </nodes>
+
+    <chain name="chain1">
+        <then value="a,b,c,s1"/>
+    </chain>
+
+    <chain name="chain2">
+        <then value="d,s2(a|b),s3"/>
+    </chain>
+</flow>

+ 1 - 1
liteflow-testcase-script-qlexpress/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>liteflow</artifactId>
         <groupId>com.yomahub</groupId>
-        <version>2.6.0</version>
+        <version>2.6.1</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 20 - 0
liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowScriptQLExpressTest.java

@@ -1,8 +1,11 @@
 package com.yomahub.liteflow.test.script.qlexpress;
 
+import cn.hutool.core.io.resource.ResourceUtil;
 import com.yomahub.liteflow.core.FlowExecutor;
 import com.yomahub.liteflow.entity.data.DefaultSlot;
 import com.yomahub.liteflow.entity.data.LiteflowResponse;
+import com.yomahub.liteflow.enums.FlowParserTypeEnum;
+import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.test.BaseTest;
 import org.junit.Assert;
 import org.junit.Test;
@@ -46,4 +49,21 @@ public class LiteflowScriptQLExpressTest extends BaseTest {
         Assert.assertTrue(response.isSuccess());
         Assert.assertEquals("d==>s2[条件脚本]==>b", response.getSlot().printStep());
     }
+
+    @Test
+    public void testScript3() throws Exception{
+        //根据配置,加载的应该是flow.xml,执行原来的规则
+        LiteflowResponse<DefaultSlot> responseOld = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseOld.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本]==>b", responseOld.getSlot().printStep());
+        //更改规则,重新加载,更改的规则内容从flow_update.xml里读取,这里只是为了模拟下获取新的内容。不一定是从文件中读取
+        String newContent = ResourceUtil.readUtf8Str("classpath: /script/flow_update.xml");
+        //进行刷新
+        FlowBus.refreshFlowMetaData(FlowParserTypeEnum.TYPE_XML, newContent);
+
+        //重新执行chain2这个链路,结果会变
+        LiteflowResponse<DefaultSlot> responseNew = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseNew.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本_改]==>a==>s3[普通脚本_新增]", responseNew.getSlot().printStep());
+    }
 }

+ 40 - 0
liteflow-testcase-script-qlexpress/src/test/resources/script/flow_update.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<flow>
+    <nodes>
+        <node id="s1" name="普通脚本" type="script">
+            <![CDATA[
+                a=3;
+                b=2;
+                slot.setData("s1",a*b);
+            ]]>
+        </node>
+
+        <node id="s2" name="条件脚本_改" type="cond_script">
+            <![CDATA[
+                count = slot.getData("count");
+                if(count > 150){
+                    return "b";
+                }else{
+                    return "a";
+                }
+            ]]>
+        </node>
+
+        <node id="s3" name="普通脚本_新增" type="script">
+            <![CDATA[
+                a=3;
+                b=2;
+                c=10;
+                slot.setData("s1",a*b+c);
+            ]]>
+        </node>
+    </nodes>
+
+    <chain name="chain1">
+        <then value="a,b,c,s1"/>
+    </chain>
+
+    <chain name="chain2">
+        <then value="d,s2(a|b),s3"/>
+    </chain>
+</flow>

+ 1 - 1
liteflow-testcase-springboot/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>liteflow</artifactId>
         <groupId>com.yomahub</groupId>
-        <version>2.6.0</version>
+        <version>2.6.1</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
liteflow-testcase-springnative/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>liteflow</artifactId>
         <groupId>com.yomahub</groupId>
-        <version>2.6.0</version>
+        <version>2.6.1</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
pom.xml

@@ -5,7 +5,7 @@
 	<groupId>com.yomahub</groupId>
     <artifactId>liteflow</artifactId>
     <packaging>pom</packaging>
-    <version>2.6.0</version>
+    <version>2.6.1</version>
 	<name>liteflow</name>
 	<description>a lightweight and practical micro-process framework</description>
 	<url>https://github.com/bryan31/liteflow</url>