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

sth*_*hzg 5 java apache-commons-pool nashorn

我正在使用Apache Commons Pool创建一个Nashorn引擎池.在应用程序启动时,我调用preparePool()将所有脚本minIdle的实例数预热eval()到引擎中,以便它可以invokeFunction()立即应答呼叫.

热身

@Override
public NashornScriptEngine create() {
    // ...
    try {
        engine.eval(asset1);
        engine.eval(asset2);
        engine.eval(asset3);
    } // ...
    return engine;
}
Run Code Online (Sandbox Code Playgroud)

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

问题

  • 我可以只预热一个实例并将其安全地克隆到minIdle实例数吗?

  • 是否可以安全地序列化并保留已创建实例的克隆?(这将允许维护引擎缓存,如果其中一个资产发生更改,则只需要使其无效)

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

Att*_*edi 3

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

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