我对(Rhino)脚本引擎和相关类的生命周期和并发语义感兴趣.特别:
Bindings应该是线程安全的?ScriptEngine.eval(...)?CompiledScript实例Invocable.getInterface(...)?我正在使用Nashorn javascript引擎来评估在java应用程序中编写的所有服务器端javascript代码.为了提高性能,我在启动时使用spring初始化JsEngine并评估和缓存所有核心工具,如Mustache和一些常见的JS工具.然后每次屏幕渲染时,这个预先评估的JsEngine将用于评估特定于页面的JavaScript代码.它在某些时候工作正常,意味着它按预期呈现页面,但在我持续点击相同的URL时开始抛出异常
我无法找到问题的根本原因.
@Component
public class JsEngine {
private ScriptEngine scriptEngine;
@PostConstruct
public void init() throws ScriptException, IOException{
scriptEngine = new ScriptEngineManager().getEngineByName("nashorn");
this.cacheAllCoreEngines();
for(String key: defaultEngineSource.keySet()){
scriptEngine.eval(defaultEngineSource.get(key));
}
}
private void cacheAllCoreEngines()throws IOException{
//read all core files such as mustache, etc.
defaultEngineSource.put("mustache", FileUtil.readFileFromDisk("<actual path..>/mustache.js"));
}
public Object eval(String source) throws ScriptException{
.... code to handle exceptions
return scriptEngine.eval (source);
}
}
Run Code Online (Sandbox Code Playgroud)
JsEngine如下所示,
public class AppRendererImpl implements AppRenderer {
@Autowired
JsEngine jsEngine;
public String render(){
....
.... //Read source from disk …Run Code Online (Sandbox Code Playgroud) 我写了一个servlet,它收集了一个java脚本代码并处理它并返回答案.因为我使用了java脚本API
在下面的代码中,如果script ="print('Hello,World')"; 代码将正确打印"hello world".但如果script ="while(true);" 脚本将无休止地循环.
import javax.script.*;
public class EvalScript {
public static void main(String[] args) throws Exception {
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
// evaluate JavaScript code from String
engine.eval(script);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果需要太长时间(比如15秒),我如何杀死eval过程?
谢谢