Groovy Shell脚本对象未完全执行

时间:2018-12-28 10:59:55

标签: java groovy groovyshell

我们正在创建一个普通的shell对象,然后将绑定传递给shell 使用shell解析常规代码并初始化Script对象,如下所示

GroovyShell shell = new GroovyShell(binding); 
Script script = shell.parse(//groovy code ); 

然后,我们将脚本对象存储在Concurrent哈希图中,并使用script.run()从该哈希图中获取脚本来运行脚本,但是脚本中的常规代码并没有完全执行,也就是说每100次运行1次。我们已经在// groovy代码中放置了日志,该代码显示代码未完全运行且未引发任何异常

1 个答案:

答案 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