我想通过使用用户可编辑的 Groovy scriptlet 来扩展我们的 Java 应用程序的脚本功能。
我的问题是 Java Scripting API 文档对 API 使用模式的描述有点简洁。
所以我的用例是:有很多 Groovy 脚本(没有编码结构或对象,只是逐行的过程代码)需要在多线程环境中完全分离和隔离地运行,它们被给出一些对象与绑定(bind)一起工作(因此应该可以在不同的输入参数上并行运行相同的脚本,并且我保证输入参数不是相同的对象实例)。而且我还想创建一些可以在每个脚本中使用的通用功能。
我的问题是:
- 我是否需要为每次执行创建一个新的 ScriptEngine 实例(通过 ScriptEngineManager 获取),或者单个 ScriptEngine 实例可用于所有执行?这是我非常关心的一个问题,即 ScriptEngine 实例(及其绑定(bind))在并发使用下的行为方式。目前,我在每次执行期间使用具有不同绑定(bind)的 ScriptEngine.eval(Bindings)。
- 我应该如何添加常用功能?如果我能以某种方式使一些通用方法可用于所有脚本,那就没问题了。
- 有什么主要问题吗?
我认为 Java API 的这一部分是高度未记录的...
最佳答案
线程行为在 JSR 223 spec 的 SCR.4.3.5.1 节中进行了描述. groovy 引擎报告自己是多线程的:
import javax.script.*
def engine = new ScriptEngineManager().getEngineByName("groovy")
assert engine.factory.getParameter("THREADING") == "MULTITHREADED"
这意味着在多线程中使用脚本引擎是安全的,只要脚本本身是线程安全的。
对于常用功能,只需将它们放入类中并将它们导入到您的脚本中即可。
关于Java Scripting API,管理状态和通用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6202550/