我需要一种在多线程环境中执行jruby脚本的方法,其中每个脚本执行都传递一个不同的java对象。
目前,我可以使用以下代码运行自包含脚本:
public class Executor {
public Executor() {
this.container = new ScriptingContainer(LocalContextScope.THREADSAFE, LocalVariableBehavior.TRANSIENT);
this.evalUnit = this.container.parse(getScriptContent());
}
public execute(HttpServletRequest request) {
this.evalUnit.run()
}
}
由于ruby脚本在构造函数中被解析为evalUnit一次并且不需要在每次执行时重新解析,因此它似乎表现良好。
但是,我希望能够将请求对象传递给脚本,但我找不到正确的方法。会有多个同时发出的请求,所以我认为我不能使用this.container.put(“$ request”,request),对吗?
更新 在JRuby 1.6中,现在有一个LocalContextScope.CONCURRENT,它似乎是我正在寻找的。据我所知,如果我将ScriptingContainer构造为新的ScriptingContainer(LocalContextScope.CONCURRENT,LocalVariableBehavior.TRANSIENT),那么我可以调用
container.getProvider().getVarMap().put("@request", request);
service.getEvalUnit().run();
并且每个线程都有自己的@request值。
我是否正确理解了这种用法?