我们想在servlet中使用Nashorn。我们的想法是使用ScriptEngine的单例实例,该实例在每次请求时都会被重用。在每次请求时,都会创建一个新的EngineScope Binding,并使用该绑定运行eval。然后清除绑定。没有共享对象传递给绑定(只是来自servlet的请求/响应对象)。
在servlet中,ScriptEngine的单例实例可以在不同的线程中同时进行评估,这会正常工作还是会遇到线程问题?以下是一些提供这个想法的代码:
ScriptEngine engine = getNashornSingleton();
ScriptContext newContext = new SimpleScriptContext();
newContext.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
Bindings engineScope =newContext.getBindings(ScriptContext.ENGINE_SCOPE);
engineScope.put("request", request);
engineScope.put("response", response);
engine.eval(jsCode, engineScope);
engineScope.clear();
答案 0 :(得分:4)
我对自己问题的回答:我不会使用如上所述的单身人士。尽管存在一些潜在的线程问题,但您可能不希望在每个请求中销毁绑定(因为它可能需要重新编译脚本)。我们最终做的是创建一个Engines池及其相关的范围绑定。引擎/绑定对。
在每个servlet请求中,我们从池中获取引擎/绑定对,将请求/响应放入绑定中,然后执行脚本。没有线程问题需要担心,因为给定的引擎/绑定对一次只能由一个线程执行。请求完成后,引擎/绑定对将返回池中。似乎运作良好。