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

标签 java scripting groovy

我想通过使用用户可编辑的 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/

相关文章:

java - 尝试在Android平台上的两个类之间传递int

java - 如何在 Linux 中捕获 Java -jar 命令输出?

python - 如何让我的 Python 脚本使用 bash 工作?

iPhone - 自动提交 Appstore

Android 应用名称取决于 buildType 和 flavors Gradle

javascript - 丢失 HTTP 请求正文

java - JPanel 不会被 PaintComponent 绘制

java - 如何在 jSTL 中使用三元运算符编写 if else 条件?

linux - 检查 bash 脚本上的 AWS cli 版本

unit-testing - 在 Spock 单元测试中,没有调用模拟方法