克隆/复制SimpleScriptContext

时间:2016-08-11 17:33:53

标签: multithreading java-8 nashorn

今天我使用ScriptContext来创建线程安全,使用跨多个线程使用的单个nashorn引擎,但是创建许多上下文非常昂贵,因为每个上下文也必须评估我的基本JS库。

有没有办法复制/克隆已经有一些基本绑定的ScriptContext(SimpleScriptContext),一旦复制,添加一些额外的绑定,同时保持线程安全?

或者,是否有另一种方法可以实现此目的以获得更好的性能,可能是克隆/复制Bindings并使用context.setBindings()?或者克隆/复制Bindings对象底层的Map并使用SimpleBindings(map)构造函数?

1 个答案:

答案 0 :(得分:0)

您可以在每次执行之前复制绑定,并将其添加到全局上下文,然后再添加到ScriptEngine。这意味着必须有一个绑定的全局副本,它具有所有JavaScript执行所需的通用映射。在每次执行之前,会在上下文引擎组合中复制和使用这些绑定,以便本地映射不会干扰全局绑定中的映射。

话虽如此,我会避免使用单个引擎来服务所有线程,因为Nashorn ScriptEngine不是线程安全的。我建议每个线程使用一个引擎。

有堆栈溢出帖子确实说ScriptEngine实际上是线程安全的,但我遇到了一些严重的串扰问题,同时使用一个引擎将绑定复制到每个调用中。

另请注意,Bindings.copyAll()无法确保JavaScript对象之间的一致行为。在JavaScript代码中,JSON.stringifying属于复制映射的对象时可能会遇到问题。

编辑:从@DennisKrøger的评论到答案,应使用ScriptContext实例代替Bindings来克服串扰。

相关问题