如何将java对象传递给servlet环境中的嵌入式JRuby容器?

时间:2011-04-27 19:03:50

标签: java multithreading jruby

我需要一种在多线程环境中执行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值。

我是否正确理解了这种用法?

0 个答案:

没有答案