在Play中为Scala控制器实现Nashorn

时间:2018-06-25 16:08:32

标签: scala playframework nashorn playframework-2.5

以下代码在Scala控制器的Play(2.5)中执行Nashorn / Javascript脚本。我注入一个类来获取运行脚本的引擎。

我在线研究了关于Nashorn的线程安全性的意见不一,所以我不清楚。从Play控制器调用的以下getEngine方法是线程安全的吗?

@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 :(得分:1)

来自getScriptEngine的javadoc:

  

通常会返回一个新的ScriptEngine,但是实现可以合并,共享或重用引擎。

因此,在一般情况下(如果始终创建新引擎),无需查看实现,这是线程安全的。

在另一种情况下,如果引擎被池化或共享,我将假定工厂代码在内部以线程安全的方式处理池化/共享。

看着https://alvinalexander.com/java/jwarehouse/openjdk-8/nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java.shtml,看来工厂确实总是会返回一个新创建的引擎。