Nashorn:与单例 ScriptEngine 并发评估?线程安全?
Nashorn: concurrent eval with singleton ScriptEngine ? thread safe?
我们想在 servlet 中使用 Nashorn。这个想法是使用在每个请求中重复使用的 ScriptEngine 的单例实例。在每次请求时,都会创建一个新的 EngineScope 绑定,并且 eval 是 运行 与该绑定。然后绑定被清除。没有共享对象被传递给绑定(只有来自 servlet 的 request/response 对象)。
在 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();
我对我自己的问题的回答:我不会像上面描述的那样使用单例。尽管存在一些潜在的线程问题,您可能不希望在每次请求时都破坏绑定(因为它可能需要重新编译脚本)。我们最终做的是创建一个引擎池及其关联的范围绑定。 engine/binding 对。
在每个 servlet 请求中,我们从池中获取一个 engine/binding 对,将 request/response 放入绑定中,然后执行脚本。无需担心线程问题,因为给定的 engine/binding 对一次仅由一个线程执行。请求完成后,engine/binding 对返回到池中。看起来效果不错。
我们想在 servlet 中使用 Nashorn。这个想法是使用在每个请求中重复使用的 ScriptEngine 的单例实例。在每次请求时,都会创建一个新的 EngineScope 绑定,并且 eval 是 运行 与该绑定。然后绑定被清除。没有共享对象被传递给绑定(只有来自 servlet 的 request/response 对象)。
在 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();
我对我自己的问题的回答:我不会像上面描述的那样使用单例。尽管存在一些潜在的线程问题,您可能不希望在每次请求时都破坏绑定(因为它可能需要重新编译脚本)。我们最终做的是创建一个引擎池及其关联的范围绑定。 engine/binding 对。
在每个 servlet 请求中,我们从池中获取一个 engine/binding 对,将 request/response 放入绑定中,然后执行脚本。无需担心线程问题,因为给定的 engine/binding 对一次仅由一个线程执行。请求完成后,engine/binding 对返回到池中。看起来效果不错。