【问题标题】:Java Scripting API, managing state and common functionalityJava Scripting API,管理状态和通用功能
【发布时间】:2011-06-02 00:55:08
【问题描述】:

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

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

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

我的问题是:

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

我认为 Java API 的这一部分没有记录在案...

【问题讨论】:

    标签: java scripting groovy


    【解决方案1】:

    JSR 223 spec 的 SCR.4.3.5.1 部分描述了线程行为。 groovy 引擎报告自己是多线程的:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      相关资源
      最近更新 更多