当前位置: 首页 > 面试题库 >

Nashorn(JSR 223)和预编译的Java脚本

赵越
2023-03-14
问题内容

我通过JSR 223使用Nashorn来执行用户输入脚本的小片段:

public Invocable buildInvocable(String script) throws ScriptException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName(ENGINE);
    engine.eval(functions);
    engine.eval(script);
    return (Invocable) engine;
}

不同的用户脚本会调用在静态中央库(在functions上面的代码片段的String中保留)中定义的JavaScript函数。

每次我想获得Invocable可以从Java调用的an时,我总是不得不重新编译大型库代码。

有什么方法可以将以前编译的代码与新代码结合在一起?


问题答案:

这是由JSR-223设计的;eval(String)后面真的没有代码缓存。嗯,从 理论上讲
可以,但是它在开发人员想要的方面体现了很多猜测(而且所有猜测在某些时候注定是错误的)。

您应该做的是评估一下您的情况Invocable,保持不动,然后反复使用。

这样做时,请注意Nashorn不提供线程安全性(JavaScript没有线程概念,所以Nashorn故意不是线程安全的,以便在语言语义不强制要求时不必支付同步成本)。因此,Invocable就基础脚本中全局变量的状态而言,从多个线程使用您创建的对象并不安全。(同时运行不与脚本的全局状态交互的函数就可以了。)

如果您需要在线程之间共享它, 并且 函数依赖于全局状态, 并且
全局状态可以更改,那么您需要为此添加自己的支架(同步,资源池或其他目前流行的方式)以此目的)。



 类似资料:
  • Handlebars.compile(template, options) 编译一个模版以立即运行。 const template = Handlebars.compile("{{foo}}"); template({}); 支持多种选项以更改模版的执行方式。 data: 设置为 false 以终止 @data 跟踪。 compat: 设置为 true 以允许递归领域查找。 knownHelpe

  • 在阅读了这篇漂亮的文章(预编译头的维护和输入)之后,我对这些在现实生活中如何实际工作产生了一些疑问。更具体地说,在以下场景中,我如何知道需要触发预编译头的重建: 我决定在我的一本书中定义一些东西。cpp文件,改变预处理器解释已包含在预编译头中的某些头的方式 预编译头的使用是否应该强制执行某种限制性的编码风格,比如将. cpp文件中包含的头的数量限制为一个,并且永远不要在. cpp文件中定义ing内

  • Mpx 支持 CSS 预编译处理,你可以通过在 style 标签上设置 lang 属性,来指定使用的 CSS 预处理器。Mpx 会根据指定的 CSS 预处理器类型,将其编译为浏览器可识别的 CSS 标准代码。 <!-- 使用 stylus --> <style lang="stylus"> .nav width 100px height 80px color #f90

  • 对Nashorn中的ENGINE_作用域和GLOBAL_作用域绑定有点困惑,尝试跟随这里的讨论。 在阅读本文之前,我对作用域(至少在rhino中)的理解是,全局_作用域中有一个单独的共享绑定,引擎_作用域中有每个单独引擎的单独绑定。然而,这一页似乎在说,每个引擎都将基本的javascript结构存储在存在于engines engine_范围(混淆地称为“Nashorn全局范围”)中的绑定中。这听起

  • 我使用的是JMeter5.0,在JSR223后处理程序中编写了一段java代码。代码如下-- 然而,当我执行测试计划时,在控制台中我会得到以下错误- ScriptException:在文件中:内联计算:的内联求值中,导入java.util.Map;导入java.util.HashMap;Map gamePlayHistoryMap=新H。..“在第6行 有人能帮我指出我可能错在哪里吗?

  • 问题内容: 在下面的代码中,我使javascript在与主要线程不同的线程中运行。该脚本是一个无限循环,因此需要以某种方式终止。怎么样? 脚本开始运行后,调用.cancel()无效。但是,如果我在线程初始化之后立即调用.cancel(),它将终止它(注释行)。 问题答案: 与Java一样,JavaScript(在Nashorn下)也不会像Java那样在紧密循环中响应中断。该脚本需要轮询中断并自动终