feat: use Groovy Engine replace Nashorn Engine.

This commit is contained in:
Echo009 2022-04-13 20:16:20 +08:00
parent 88b92e2994
commit 7539faffff
4 changed files with 31 additions and 23 deletions

View File

@ -267,6 +267,19 @@
<version>${swagger.version}</version> <version>${swagger.version}</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-jsr223 -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-jsr223</artifactId>
<version>3.0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-json -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-json</artifactId>
<version>3.0.10</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -14,9 +14,9 @@ import javax.script.ScriptEngineManager;
*/ */
@Slf4j @Slf4j
@Component @Component
public class JavaScriptEvaluator implements Evaluator { public class GroovyEvaluator implements Evaluator {
private static final ScriptEngine ENGINE = new ScriptEngineManager().getEngineByName("nashorn"); private static final ScriptEngine ENGINE = new ScriptEngineManager().getEngineByName("groovy");
@Override @Override

View File

@ -10,7 +10,7 @@ import tech.powerjob.common.enums.WorkflowNodeType;
import tech.powerjob.common.exception.PowerJobException; import tech.powerjob.common.exception.PowerJobException;
import tech.powerjob.common.model.PEWorkflowDAG; import tech.powerjob.common.model.PEWorkflowDAG;
import tech.powerjob.common.serialize.JsonUtils; import tech.powerjob.common.serialize.JsonUtils;
import tech.powerjob.server.core.evaluator.JavaScriptEvaluator; import tech.powerjob.server.core.evaluator.GroovyEvaluator;
import tech.powerjob.server.core.workflow.algorithm.WorkflowDAG; import tech.powerjob.server.core.workflow.algorithm.WorkflowDAG;
import tech.powerjob.server.core.workflow.algorithm.WorkflowDAGUtils; import tech.powerjob.server.core.workflow.algorithm.WorkflowDAGUtils;
import tech.powerjob.server.core.workflow.hanlder.ControlNodeHandler; import tech.powerjob.server.core.workflow.hanlder.ControlNodeHandler;
@ -26,7 +26,7 @@ import java.util.*;
@Component @Component
public class DecisionNodeHandler implements ControlNodeHandler { public class DecisionNodeHandler implements ControlNodeHandler {
private final JavaScriptEvaluator javaScriptEvaluator = new JavaScriptEvaluator(); private final GroovyEvaluator groovyEvaluator = new GroovyEvaluator();
/** /**
* 处理判断节点 * 处理判断节点
@ -45,7 +45,7 @@ public class DecisionNodeHandler implements ControlNodeHandler {
}); });
Object result; Object result;
try { try {
result = javaScriptEvaluator.evaluate(script, wfContext); result = groovyEvaluator.evaluate(script, wfContext);
} catch (Exception e) { } catch (Exception e) {
log.error("[Workflow-{}|{}]failed to evaluate decision node,nodeId:{}", wfInstanceInfo.getWorkflowId(), wfInstanceInfo.getWfInstanceId(), node.getNodeId(), e); log.error("[Workflow-{}|{}]failed to evaluate decision node,nodeId:{}", wfInstanceInfo.getWorkflowId(), wfInstanceInfo.getWfInstanceId(), node.getNodeId(), e);
throw new PowerJobException("can't evaluate decision node!"); throw new PowerJobException("can't evaluate decision node!");

View File

@ -11,11 +11,11 @@ import java.util.HashMap;
/** /**
* @author Echo009 * @author Echo009
* @since 2021/12/10 * @since 2022/04/13
*/ */
public class JavaScriptEvaluatorTest { public class GroovyEvaluatorTest {
private final JavaScriptEvaluator javaScriptEvaluator = new JavaScriptEvaluator(); private final GroovyEvaluator groovyEvaluator = new GroovyEvaluator();
private final HashMap<String, String> SIMPLE_CONTEXT = new HashMap<>(); private final HashMap<String, String> SIMPLE_CONTEXT = new HashMap<>();
@ -44,41 +44,36 @@ public class JavaScriptEvaluatorTest {
@Test @Test
public void testSimpleEval1() { public void testSimpleEval1() {
Object res = javaScriptEvaluator.evaluate("var x = false; x;", null); Object res = groovyEvaluator.evaluate("var x = false; x;", null);
Assert.assertEquals(false, res); Assert.assertEquals(false, res);
} }
@Test @Test
public void testSimpleEval2() { public void testSimpleEval2() {
Object res = javaScriptEvaluator.evaluate("var person = {name:'echo',tag:'y'}; person.name;", null); // inject simple context
Assert.assertEquals("echo", res); Object res = groovyEvaluator.evaluate("var res = context.k3; res;", SIMPLE_CONTEXT);
Boolean s = JsonUtils.parseObjectUnsafe(res.toString(), Boolean.class);
Assert.assertEquals(false, s);
} }
@Test @Test
public void testSimpleEval3() { public void testSimpleEval3() {
// inject simple context Object res = groovyEvaluator.evaluate("var res = new groovy.json.JsonSlurper().parseText(context.k3); res == false;", SIMPLE_CONTEXT);
Object res = javaScriptEvaluator.evaluate("var res = context.k3; res;", SIMPLE_CONTEXT);
Boolean s = JsonUtils.parseObjectUnsafe(res.toString(), Boolean.class);
Assert.assertEquals(false, s);
}
@Test
public void testSimpleEval4() {
Object res = javaScriptEvaluator.evaluate("var res = JSON.parse(context.k3); res == false;", SIMPLE_CONTEXT);
Assert.assertEquals(true, res); Assert.assertEquals(true, res);
} }
@Test @Test
public void testComplexEval1() { public void testComplexEval1() {
// array // array
Object res = javaScriptEvaluator.evaluate("var res = JSON.parse(context.array); res[0] == 1;", COMPLEX_CONTEXT); Object res = groovyEvaluator.evaluate("var res = new groovy.json.JsonSlurper().parseText(context.array) ; res[0] == 1;", COMPLEX_CONTEXT);
Assert.assertEquals(true, res); Assert.assertEquals(true, res);
// map // map
res = javaScriptEvaluator.evaluate("var map = JSON.parse(context.map); var e1 = map.e1; e1.value ",COMPLEX_CONTEXT); res = groovyEvaluator.evaluate("var map = new groovy.json.JsonSlurper().parseText(context.map); var e1 = map.e1; e1.value ",COMPLEX_CONTEXT);
Assert.assertEquals(1,res); Assert.assertEquals(1,res);
// object // object
res = javaScriptEvaluator.evaluate("var e3 = JSON.parse(context.obj); var e1 = e3.sub.sub; e1.value ",COMPLEX_CONTEXT); res = groovyEvaluator.evaluate("var e3 = new groovy.json.JsonSlurper().parseText(context.obj); var e1 = e3.sub.sub; e1.value ",COMPLEX_CONTEXT);
Assert.assertEquals(1,res); Assert.assertEquals(1,res);
} }