当前位置: 首页 > 知识库问答 >
问题:

Nashorn:与单例脚本引擎并发评估?线程安全?

酆出野
2023-03-14

我们想在servlet中使用Nashorn。这个想法是使用ScriptEngine的单例实例,该实例在每次请求时都被重用。在每次请求时都会创建一个新的Engineering Scope绑定,并使用该绑定运行评估。然后清除绑定。没有共享对象被传递给绑定(只有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();

共有1个答案

郎鸿
2023-03-14

我对自己问题的回答是:我不会像上面所描述的那样使用单例。尽管存在一些潜在的线程问题,但您可能不想在每次请求时销毁绑定(因为它可能需要重新编译脚本)。我们最终做的是创建一个引擎池及其关联的范围绑定。发动机/绑定副。

在每个servlet请求中,我们从池中获取一个引擎/绑定对,将请求/响应放入绑定中,然后执行脚本。不需要担心线程问题,因为给定的引擎/绑定对一次只能由一个线程执行。请求完成后,引擎/绑定对将返回到池中。看起来效果不错。

 类似资料:
  • 我正试图使用Java8的全新Nashorn引擎,将JavaScript功能带到我的机器人平台上。以下是用于创建Nashorn脚本引擎实例的行: 在我自己的计算机上运行它可以正常工作,但是在部署平台上,生成的nashorn对象为null,并且无论何时使用它当然都会给出NullPointerException。经过一点调试,我们知道新的ScriptEngineering Manager()不是空的,但

  • 在下面的代码中,javascript运行在与主线程不同的单独线程中。该脚本是一个无限循环,因此需要以某种方式终止。怎样 使命感脚本开始运行后,cancel()不起作用。但如果我打电话。cancel()在线程初始化之后,它将终止它(注释掉的行)。

  • 通过Java的Nashorn脚本引擎,我可以使用如下绑定在eval()的上下文中提供对象: 我希望通过提供一个默认对象来简化javascript,这样javascript就不是: 我可以写: 有没有办法做到这一点?(someMethod是对象上的方法,而不是静态方法)

  • 任何人都可以澄清NashScript引擎是否线程安全?如果不是线程安全的,如何处理多个脚本?

  • 问题内容: 在下面的代码中,我使javascript在与主要线程不同的线程中运行。该脚本是一个无限循环,因此需要以某种方式终止。怎么样? 脚本开始运行后,调用.cancel()无效。但是,如果我在线程初始化之后立即调用.cancel(),它将终止它(注释行)。 问题答案: 与Java一样,JavaScript(在Nashorn下)也不会像Java那样在紧密循环中响应中断。该脚本需要轮询中断并自动终

  • 问题内容: 我们正在购买业务规则引擎。我们希望使我们的核心应用程序可定制为具有稍微不同要求的不同客户。实际进行定制的人员是分析师。即非熟练技术人员(通常具有科学学位)。 评估业务规则引擎的标准是什么?有开源和商业的吗?您在易用性,文档,支持,价格等方面的经验是什么 我们的应用程序使用Java。 问题答案: Drools(以前是Drools,然后是JBoss Rules,然后又是Drools)是一个