美文网首页
java执行groovy脚本

java执行groovy脚本

作者: 杜子龙 | 来源:发表于2020-04-02 23:02 被阅读0次

    以下代码亲测可行:

    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);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:java执行groovy脚本

          本文链接:https://www.haomeiwen.com/subject/fadqphtx.html