以下代码在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)
}
}
答案 0 :(得分:1)
来自getScriptEngine
的javadoc:
通常会返回一个新的ScriptEngine,但是实现可以合并,共享或重用引擎。
因此,在一般情况下(如果始终创建新引擎),无需查看实现,这是线程安全的。
在另一种情况下,如果引擎被池化或共享,我将假定工厂代码在内部以线程安全的方式处理池化/共享。
看着https://alvinalexander.com/java/jwarehouse/openjdk-8/nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java.shtml,看来工厂确实总是会返回一个新创建的引擎。