JSR 223 javax.script API-将Groovy与Java应用程序集成

时间:2018-12-21 21:19:30

标签: java groovy

我在DB中有30种不同的Groovy脚本,需要在Java程序中执行。这些脚本用于按摩输入数据。由于数据按摩逻辑过于动态(不时更改),因此我将使用groovy脚本将其外部化,以便可以在DB中更新逻辑。

很少有带有某些参数的脚本。

将有数百万个请求,我需要为每个请求执行这30个脚本。

我正在执行的代码,

public String execute(final String expression, final Map<String, Object> inputs) {
        final ScriptEngine engine = new ScriptEngineManager().getEngineByName("groovy");
        Object returnValue = null;
        try {
            for (String key:inputs.keySet()){
              engine.put(key, key:inputs.get(key));
            }  
            engine.eval(expression);
            try {
                return ((Invocable)engine).invokeFunction("getValue", value[0]);
            }
            catch (final NoSuchMethodException e) {
                e.printStackTrace();
            }
         }
       catch (final ScriptException e) {
         e.printStackTrace();
       }
       return null;
    }

在这里,表达式是从DB加载的脚本。 使用

  

engine.put(key,key:inputs.get(key));

用于在脚本中传递参数值。

在这里,我有几个问题。

  1. 这是在Java中集成Groovy的最佳方法吗?
  2. 每次我调用engine.eval时,脚本是否都会编译?如果是这样,则性能确实是最差的。
  3. 对每个调用的每个脚本执行以下代码可能很繁琐。
  

ScriptEngine引擎=新   ScriptEngineManager()。getEngineByName(“ groovy”);

我为不同的脚本传递了不同的输入。还有其他更好的方法吗?

  1. 我遇到了Groovy类加载器和编译器。那将是一个比这更好的选择吗,因为我可以从数据库加载脚本并在应用启动时预编译所有30个脚本,而仅使用编译后的代码。

  2. 还有其他更好的方式使用groovy或其他方式吗?

0 个答案:

没有答案