Сценарий Groovy Shell не полностью выполнен

Мы создаем объект-оболочку groovy и передаем привязки к оболочке, затем анализируем код groovy с помощью оболочки и инициализируем Script объект как показано ниже

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

Затем мы сохраняем объект сценария в Concurrent hashmap и запускаем сценарий, используя script.run() извлечение сценария из этого хэш-карты, но Groovy-код в сценарии не выполняется полностью, скажем, 1 из 100 запусков. мы поместили логи в //groovy код, который показывает, что код не запустился полностью, и ни одно исключение не выдается

1 ответ

Когда вы запускаете один и тот же экземпляр Script в разных потоках одновременно, он может быть остановлен только логикой вашего скрипта.

если вы хотите кэшировать анализируемый скрипт, сохраните в вашей карте проанализированный класс, а не экземпляр скрипта, и для каждого запуска перепривязывайте переменные.

следующий фрагмент кода должен дать вам представление, как это сделать:

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
Другие вопросы по тегам