Как передать объекты Java во встроенный контейнер JRuby в среде сервлета? - PullRequest
2 голосов
/ 27 апреля 2011

Мне нужен способ выполнения сценария 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), правильно?

UPDATE В JRuby 1.6 естьтеперь LocalContextScope.CONCURRENT, который, кажется, является тем, что я ищу.Из того, что я могу сказать, если я создаю ScriptingContainer как новый ScriptingContainer (LocalContextScope.CONCURRENT, LocalVariableBehavior.TRANSIENT), тогда я могу вызвать

container.getProvider().getVarMap().put("@request", request);
service.getEvalUnit().run();

, и у каждого потока будет свое значение @request.

Правильно ли я понимаю это использование?

...