2011-06-01 51 views
1

我想通过使用用户可编辑的Groovy scriptlet来扩展我们的Java应用程序和脚本功能。Java脚本API,管理状态和通用功能

我的问题是Java脚本API文档对API使用模式有点简单。

所以我的用例是:有很多Groovy脚本(没有编码结构或对象,只是过程代码一行一行地)需要在多线程环境中完全分离和隔离运行,它们是给定一些对象来处理Bindings(所以应该可以在不同的输入参数上并行运行相同的脚本,并且我保证输入参数不是相同的对象实例)。另外我想创建一些可用于每个脚本的通用功能。

我的问题是:

  • 我需要,该ScriptEngine(通过ScriptEngineManager收购),每处决或单一的ScriptEngine实例的新实例,可用于所有执行?我非常关心的是,ScriptEngine实例(及其绑定)如何在并发使用下运行。目前我在每次执行期间使用ScriptEngine.eval(Bindings)和不同的绑定。
  • 我应该如何添加常用功能?如果我能以某种方式为所有脚本提供一些常用方法,那就没问题了。
  • 是否有任何重大陷阱?

我认为Java API中的这一部分的相关资料很少...

回答

4

线程行为在JSR 223 spec节SCR.4.3.5.1描述。 Groovy的引擎报告本身是多线程:

import javax.script.* 
def engine = new ScriptEngineManager().getEngineByName("groovy") 
assert engine.factory.getParameter("THREADING") == "MULTITHREADED" 

这意味着它是安全的使用脚本引擎在多线程,只要剧本本身是线程安全的。

对于常用功能,只需将它们放入类中并将它们导入到脚本中。