我在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));
用于在脚本中传递参数值。
在这里,我有几个问题。
ScriptEngine引擎=新 ScriptEngineManager()。getEngineByName(“ groovy”);
我为不同的脚本传递了不同的输入。还有其他更好的方法吗?
我遇到了Groovy类加载器和编译器。那将是一个比这更好的选择吗,因为我可以从数据库加载脚本并在应用启动时预编译所有30个脚本,而仅使用编译后的代码。
还有其他更好的方式使用groovy或其他方式吗?