юзкейс такой
есть сторонние ребята, который пишут js код, используя определенный API через либы, которые у нас написаны на java (у нас свой require реализован просто)
В js скрипты передаются входные данные используя унифицированный API
Скриптов этих пару тысяч
На нашорне система была какая
Есть объектный пул из ScriptEngine с блокирующим доступом.
Во время выполнения колла получаем объект ScriptEngine и смотрим, компилировали ли мы уже текущий скрипт, если нет, то компилируем,
Дабы не было пересечения по глобальным переменным каждый скрипт прогоняется через парочку регулярок которые оборачивают весь скрипт в неймспейс и и заменяют глобальные переменные на переменные неймспейса
Потом уже во время выполнения мы просто делаем callMember на ScriptObjectMirror полученного для неймспейса, тогда нам не нужено каждый раз прогонять скрипт
С граалем я попробовал вообще упростить систему и избавиться от пула, т.к Context не имеет глобальной области видимости, но при высокой нагрузке очень быстро заполняется хип
поэтому оставил как есть, просто заменил нашорн на грааль