我们正在创建一个普通的shell对象,然后将绑定传递给shell
使用shell解析常规代码并初始化Script
对象,如下所示
GroovyShell shell = new GroovyShell(binding);
Script script = shell.parse(//groovy code );
然后,我们将脚本对象存储在Concurrent哈希图中,并使用script.run()
从该哈希图中获取脚本来运行脚本,但是脚本中的常规代码并没有完全执行,也就是说每100次运行1次。我们已经在// groovy代码中放置了日志,该代码显示代码未完全运行且未引发任何异常
答案 0 :(得分:1)
当您同时在不同线程中运行同一脚本实例时,仅通过脚本逻辑即可停止该脚本。
如果要缓存已解析的脚本,则将已解析的类而不是脚本的实例存储到映射中,并针对每次运行重新绑定变量。
以下代码段应为您提供一个实现方法:
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