相关疑难解决方法(0)

什么是Rhino Script Engine的生命周期和并发语义

我对(Rhino)脚本引擎和相关类的生命周期和并发语义感兴趣.特别:

  1. Bindings应该是线程安全的?
  2. 是否应该允许多个线程共享一个ScriptEngine实例?
  3. ...或者每个线程是否应构建一个短期实例?
  4. ......还是把它们放在游泳池里?
  5. 如果多个线程同时调用会发生什么ScriptEngine.eval(...)
  6. 对于同样的问题CompiledScript实例
  7. 使用生成的接口实现的相同问题Invocable.getInterface(...)
  8. 据推测,放置在Bindings中的对象遵循Java的垃圾收集.那些没有在绑定中结束的对象的垃圾收集呢?

java concurrency lifecycle rhino

30
推荐指数
1
解决办法
4034
查看次数

来自Nashorn的IllegalArgumentException异常 - 这是Java 8中的错误吗?

我正在使用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)

java spring java-8 nashorn

14
推荐指数
1
解决办法
1081
查看次数

java脚本API - 如何停止评估

我写了一个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过程?

谢谢

java api scripting

6
推荐指数
2
解决办法
8824
查看次数

标签 统计

java ×3

api ×1

concurrency ×1

java-8 ×1

lifecycle ×1

nashorn ×1

rhino ×1

scripting ×1

spring ×1