【问题标题】:Implementing Nashorn in Play for Scala controller在 Play 中为 Scala 控制器实现 Nashorn
【发布时间】:2018-06-25 16:08:32
【问题描述】:

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

我在网上进行了研究,关于 Nashorn 的线程安全性意见不一,所以我不清楚。下面的 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)
    }


 }

【问题讨论】:

    标签: scala playframework nashorn playframework-2.5


    【解决方案1】:

    来自getScriptEngine的javadoc:

    通常会返回一个新的 ScriptEngine,但实现可能会汇集、共享或重用引擎。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 2015-09-30
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多