微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在使用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实例的数量吗?
>是否可以安全地序列化并保留已创建实例的克隆? (这将允许维护引擎缓存,如果其中一个资产发生更改,则只需要使其无效)

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

> SO: Clone Entire JavaScript Engine

最佳答案
Nashorn的引擎实例既不可复制也不可序列化.我建议您使用单个引擎实例,并使用ScriptEngine.createBindings()创建多个Bindings对象并对其进行池化.您显然需要通过调用ScriptEngine.eval(String | Reader,Bindings)方法来初始化每个Bindings. (您也可以使用ScriptContext对象而不仅仅是Bindings;它们实际上是绑定和out / err流的元组.)

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

原文地址:https://www.jb51.cc/java/437225.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐