Сценарий 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