Запуск и оптимизация динамического выполнения Groovy Scripts в Java-приложении - PullRequest
0 голосов
/ 02 февраля 2019

Я изучал методы динамического запуска groovy-скриптов в java-приложении.

Я прошел через такие методы, как: 1. Groovy Shell

binding.setVariable("x", 5);
String script = "y = x * x"
GroovyShell gs = new GroovyShell();
Script script = gs.parse(script);
script.run();
Использование GroovyClassLoader.

У меня есть два java-приложения.Одним из них является серверная часть для графического интерфейса, который хранит данные во время их выполнения.Там нет общего кеша между ними.Чтобы избежать накладных расходов на компиляцию каждый раз, я собираюсь сначала скомпилировать приложение в приложении B, а затем кэшировать его (чтобы избежать утечки памяти).Кроме того, я попытался сохранить файлы классов, сгенерированные путем первоначальной компиляции сценария, а затем сохранить его в базе данных в виде байтов, но до сих пор не добился успеха.

Однако я не уверен, чтоэто было бы оптимизацией или если Groovy Shell / Groovy Class Loader уже кэширует сгенерированные файлы классов.Каким должен быть лучший способ для этого?

Кроме того, сценарии не должны быть простыми, поэтому какой механизм будет лучше, Groovy Shell или Groovy Class Loader?(Также изучает GrooyScriptEngine, но, похоже, он не понадобится для простых скриптов).

1 Ответ

0 голосов
/ 05 февраля 2019

Afaik gs.parse (скрипт) не будет кэшировать компиляцию.Таким образом, кеширование скрипта поможет, так как вам не придется каждый раз платить за компиляцию.Если вы действительно хотите записать байт-код в базу данных, я предлагаю использовать GroovyClassLoader (GCL) ... На самом деле я предлагаю создать его подкласс и переопределить createCollector, чтобы предоставить свой собственный сборщик (делегирование исходному сборщику), что позволяетвам получить доступ к байту [].Или вы используете BytecodeProcessor , который вы должны установить в конфигурации компилятора, которую вы задаете своему GCL.

...