Java 准备Nashorn引擎的ApacheCommons池的有效方法

Java 准备Nashorn引擎的ApacheCommons池的有效方法,java,nashorn,apache-commons-pool,Java,Nashorn,Apache Commons Pool,我正在使用创建一个Nashorn引擎池。在应用程序启动时,我调用将minIdle实例数预热到eval()引擎中的所有脚本,以便它可以立即响应对invokeFunction()的调用 热身 @覆盖 公共NashScript引擎创建(){ // ... 试一试{ 发动机评估(资产1); 发动机评估(资产2); 发动机评估(asset3); } // ... 返回引擎; } 根据池大小和预加载脚本的复杂性,这需要相当长的时间 问题 我是否可以只预热一个实例并将其安全克隆到minIdle实例数 所创

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

热身

@覆盖
公共NashScript引擎创建(){
// ...
试一试{
发动机评估(资产1);
发动机评估(资产2);
发动机评估(asset3);
} // ...
返回引擎;
}
根据池大小和预加载脚本的复杂性,这需要相当长的时间

问题

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

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

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


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

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