Краткая версия: Как получить узлы правил JBPM5 для использования файла DRL, который считывает и обновляет переменные процесса?Доступ к экземпляру процесса из Задачи правил в JBPM 5
Длинная версия: У меня есть определение процесса, которое выполняется под JBPM5. Начало этого процесса выглядит примерно так:
[Пуск] ---> [Правило Node] ---> [Шлюз (Расхождение)] ... и т.д.
Шлюз использует ограничения на переменном с именем isValid.
Мой Правило Узел указывает на RuleFlowGroup «Подтвердить», который содержит только одно правило:
rule "Example validation rule"
ruleflow-group "validate"
when
processInstance : WorkflowProcessInstance()
then
processInstance.setVariable("isValid", new Boolean(false));
end
Так, по моей логике, если это становится правильно обработан, то шлюз должен всегда следовать «ложный» путь.
В моей Java код, у меня есть что-то вроде следующего:
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("myProcess.bpmn"), ResourceType.BPMN2);
kbuilder.add(ResourceFactory.newClassPathResource("myRules.drl"), ResourceType.DRL);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
new Thread(new Runnable()
{
public void run()
{
ksession.fireUntilHalt();
}
}).start();
// start a new process instance
Map<String, Object> params = new HashMap<String, Object>();
params.put("isValid", true);
ksession.startProcess("test.processesdefinition.myProcess", params);
Я могу подтвердить следующее:
- ДХО файл становится загружен в оперативную память, потому что, когда я положил синтаксис ошибки в файле, то я получаю ошибки.
- Если я включаю значение для «isValid» в карте params Java, процесс только всегда следует по пути, указанному Java, по-видимому игнорируя правило спуска.
- Если я беру параметр isValid из карты params, я получаю ошибку времени выполнения.
Исходя из этого, я предполагаю, что конечная строка «setVariable» в правиле либо не выполняется, либо обновляет неправильную вещь.
Я думаю, что моя проблема связана с этим утверждением в официальной документации: ограничения
правило, не имеет прямой доступ к переменным, определенным внутри процесса. Это , однако можно ссылаться на текущий экземпляр процесса внутри ограничения правила, добавив экземпляр процесса в рабочую память и соответствующий для экземпляра процесса в вашем правиле ограничения. Мы добавили специальную логику, чтобы убедиться, что переменная processInstance типа WorkflowProcessInstance будет соответствовать только текущему экземпляру процесса, а не другим экземплярам процесса в рабочей памяти. Обратите внимание, что вы, тем не менее, сами ответственны за , вставьте экземпляр процесса в сеанс и, возможно, его обновите, например, используя код Java или действие on-entry или on-exit или явное действие в вашем процессе.
Однако я не могу понять, как это сделать, как описано здесь. Как добавить экземпляр процесса в рабочую память таким образом, чтобы он был доступен для этого первого узла правил?Правило Nodes, похоже, не поддерживает поведение на входе, и я не могу добавить его в код Java, потому что процесс может очень легко завершить выполнение узла правил до, рабочая память была обновлена, чтобы включить этот процесс.
Спасибо Kris, добавив задачу сценария, чтобы явно сделать это, устранила проблему. Есть ли причина, по которой процесс автоматически не добавляет себя в рабочую память при входе в узел правил? Похоже, что небольшое преимущество для узла правил, который не может получить доступ к своим переменным процесса, и добавление этих инструкций в процесс смешивает среду исполнения с реальными намерениями бизнеса, что кажется беспорядочным ... – Erica