Мне нужен способ выполнения сценария 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.
Правильно ли я понимаю это использование?