我们正在创建一个 groovy shell 对象并将绑定(bind)传递给 shell,然后
使用 shell 解析 groovy 代码并初始化 Script
对象如下
GroovyShell shell = new GroovyShell(binding);
Script script = shell.parse(//groovy code );
然后我们将脚本对象存储在并发 HashMap 中并使用 script.run()
运行脚本从这个 hashmap 中获取脚本,但是脚本中的 groovy 代码没有完全执行,比如说 100 次运行中有 1 次。我们在//groovy 代码中放置了日志,显示代码没有完全运行,也没有抛出任何异常
最佳答案
当您同时在不同线程中运行相同的脚本实例时,它可能会被脚本的逻辑停止。
如果您想缓存已解析的脚本,请将已解析的类而不是脚本的实例存储到映射中,并为每次运行重新绑定(bind)变量。
下面的代码片段应该能让您了解如何做到这一点:
scriptMap = new HashMap()
Script getScript(String code){
Class<Script> scriptClass = scriptMap.get(code);
if(scriptClass)return script.newInstance();
GroovyShell shell = new GroovyShell();
Script script = shell.parse( code );
scriptMap.put(code, script.getClass());
return script;
}
Object runScript(String code, Map variables){
Script script=getScript(code);
script.setBinding( new Binding(variables) );
return script.run();
}
println runScript("a+b", [a:2,b:7])
println runScript("(b-a)*3", [a:7,b:9])
println scriptMap
关于java - Groovy Shell 脚本对象未完全执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957449/