以下代码亲测可行:
package cn.wesure.wof.workflow;
import cn.wesure.wof.common.util.MD5Util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import javax.script.*;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class Application {
private final static ConcurrentHashMap<String, CompiledScript> compiledScriptMap = new ConcurrentHashMap<>();
private static ScriptEngine engine = null;
public static ScriptEngine getScriptEngine() {
if (engine == null) {
synchronized (ScriptEngine.class) {
if (engine == null) {
ScriptEngineManager engineManager = new ScriptEngineManager();
engine = engineManager.getEngineByName("groovy");
}
}
}
return engine;
}
private static Object evalCacheCompilable(String expression,ScriptEngine engine) {
try {
String functionKey = MD5Util.md5(expression);
final CompiledScript compiledScript = compiledScriptMap.get(functionKey);
if (compiledScript != null) {
//如果缓存中有,直接调用
final Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
return compiledScript.eval(bindings);
}
//如果缓存中没有,生成并且存到concurrentHashMap
Object obj = null;
if (compiledScript == null) {
Compilable compilable =(Compilable)engine;
final CompiledScript compile = compilable.compile(expression);
compiledScriptMap.put(functionKey,compile);
final Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
obj = compile.eval(bindings);
}
return obj;
} catch (ScriptException e) {
System.out.println("执行groovy脚本失败");
}
return null;
}
public static void main(String[] args) {
JSONObject jsonObject = JSON.parseObject("{\"name\": \"groot\"}");
ScriptEngine engine = getScriptEngine();
Bindings variables = engine.createBindings();//这里的变量可以直接在引擎中调用
variables.put("jsonObject", jsonObject);
engine.setBindings(variables, ScriptContext.ENGINE_SCOPE);
Object tmp = evalCacheCompilable("return jsonObject.name", engine);//groovy返回string类型
System.out.println(tmp);
Object tmp2 = evalCacheCompilable("return [\"name\": \"groot\"]", engine);//groovy返回map类型
if(tmp2 != null && tmp2 instanceof Map){
Map map = (Map)tmp2;
Object res = map.get("name");
System.out.println(res);
}
}
}
网友评论