java - Groovy Shell 脚本对象未完全执行

标签 java groovy groovyshell

我们正在创建一个 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/

相关文章:

groovy 中的 Python 队列类型

java - 根据文件名中的日期对文件进行排序

java - 使用 Arrays.sort() 对并行数组进行排序

jenkins - 在 jenkins 管道脚本中获取 gradle 变量

groovysh 找不到方法

Grails shell 看不到域对象

java - 从抽象类调用未声明的 super 方法时获取当前对象属性

java - Google map api 搜索位置并添加显示 NullPointEreException 错误的标记

grails - 在这种情况下,findAllBy *如何工作?