Реализация Nashorn в игре для контроллера Scala - PullRequest
0 голосов
/ 25 июня 2018

Приведенный ниже код выполняет скрипт Nashorn / Javascript в Play (2.5) для контроллера Scala.Я внедряю класс, чтобы получить движок, который запускает скрипт.

Я проводил исследования в Интернете, и существуют разные мнения в отношении безопасности потоков Нэшорна, поэтому я неясен.Является ли приведенный ниже метод getEngine, вызываемый из контроллера Play, потокобезопасным?

@Singleton
class JavascriptEngine {

   val factory = new NashornScriptEngineFactory

   def getEngine = {  // <-- thread safe?
     factory.getScriptEngine()
   }

}


class Test @Inject()(je: JavascriptEngine) extends Controller  {

    def test = Action { request =>
         val script = "var x = 'this is script 1'; "
         runJS(script)
         Ok("some response")
    }

    def runJS (script: String) = {
          val engine = je.getEngine
          engine.eval(script)
          val x = engine.get("x")
          println(x)
    }


 }

1 Ответ

0 голосов
/ 26 июня 2018

Из javadoc getScriptEngine:

Обычно возвращается новый ScriptEngine, но реализации могут объединять, совместно использовать или повторно использовать движки.

Итак, не глядяпри реализации, в общем случае (если новый движок создается всегда), это потокобезопасно.

В другом случае, если двигатели объединяются в пулы или совместно используются, я бы предположил, что заводской код внутренне обрабатывает объединение в пул / совместное использование потоковым способом.

Просмотр https://alvinalexander.com/java/jwarehouse/openjdk-8/nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java.shtml кажется, что фабрика действительно всегда возвращает вновь созданный двигатель.

...