Java Scripting API,管理状态和常用功能

时间:2011-06-01 14:09:47

标签: java scripting groovy

我想通过使用用户可编辑的Groovy scriptlet扩展我们的Java应用程序脚本功能。

我的问题是Java Scripting API文档对API使用模式有点简洁。

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

我的问题是:

  • 我是否需要为每次执行创建ScriptEngine的新实例(通过ScriptEngineManager获取),或者单个ScriptEngine实例可用于所有执行?这是我的一个重要问题,即ScriptEngine实例(及其绑定)在并发使用下的行为方式。目前,我在每次执行时都使用ScriptEngine.eval(Bindings)和不同的绑定。
  • 我应该如何添加常用功能?如果我能以某种方式为所有脚本提供一些常用方法,那就没关系了。
  • 有任何重大问题吗?

我认为Java API的这一部分是高度无证的......

1 个答案:

答案 0 :(得分: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"

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

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