gpt4 book ai didi

java - 准备 Nashorn 引擎的 Apache Commons 池的有效方法

转载 作者:搜寻专家 更新时间:2023-10-31 20:18:16 25 4
gpt4 key购买 nike

我正在使用 Apache Commons Pool创建一个 Nashorn 引擎池。在申请开始时,我调用 preparePool()minIdle 个实例预热到 eval() 引擎中的所有脚本,以便它准备好响应对 invokeFunction() 的调用立即。

热身

@Override
public NashornScriptEngine create() {
// ...
try {
engine.eval(asset1);
engine.eval(asset2);
engine.eval(asset3);
} // ...
return engine;
}

根据池大小和预加载脚本的复杂性,这需要相当长的时间。

问题

  • 我能否只预热一个实例并将其安全地克隆到 minIdle 个实例的数量?

  • 是否可以安全地序列化和持久化已创建实例的克隆? (这将允许维护一个引擎缓存,只需要在其中一项 Assets 发生变化时失效)

相关资源(将在适当时更新此部分)

最佳答案

Nashorn 的引擎实例既不可克隆也不可序列化。不过,我建议您使用单个引擎实例并使用 ScriptEngine.createBindings() 创建多个 Bindings 对象并将它们合并。您显然需要通过调用 ScriptEngine.eval(String|Reader, Bindings) 方法来初始化每个绑定(bind)。 (您还可以使用 ScriptContext 对象而不仅仅是 Bindings;它们实际上是绑定(bind)和输出/错误流的元组。)

使用单个 ScriptEngine 的好处是代码共享。将同一个脚本评估为多个绑定(bind)仍然只会编译一次脚本(如果您使用 Compilable 接口(interface))并且所有函数对象的代码将由相同的编译字节码表示。

关于java - 准备 Nashorn 引擎的 Apache Commons 池的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33690353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com