Сценарий Groovy Shell не полностью выполнен - PullRequest
0 голосов
/ 28 декабря 2018

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

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

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

1 Ответ

0 голосов
/ 28 декабря 2018

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

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

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

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
...