Краткая версия : Как заставить узлы правил JBPM5 использовать файл DRL, который считывает и обновляет переменные процесса?
Длинная версия :
У меня есть определение процесса, работающего под JBPM5. Начало этого процесса выглядит примерно так:
[Пуск] ---> [Узел правил] ---> [Шлюз (Дивергенция)] ... и т. Д.
Шлюз использует ограничения на переменную с именем 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);
Я могу подтвердить следующее:
- Файл drl загружается в рабочую память, потому что, когда я помещаю синтаксические ошибки в файл, я получаю ошибки.
- Если я включу значение для «isValid» в карту параметров Java, процесс будет всегда следовать только пути, указанному в Java, очевидно игнорируя правило drools.
- Если я возьму параметр isValid из карты параметров, я получу ошибку времени выполнения.
Исходя из этого, я предполагаю, что последняя строка "setVariable" в правиле либо не выполняется, либо обновляется не так.
Я думаю, что моя проблема связана с этим утверждением в официальной документации:
Ограничения правил не имеют прямого доступа к переменным, определенным внутри процесса. это
однако возможно сослаться на текущий экземпляр процесса внутри ограничения правила, добавив
экземпляр процесса в рабочую память и соответствие экземпляра процесса в вашем
ограничение правил. Мы добавили специальную логику, чтобы убедиться, что переменная processInstance
Тип WorkflowProcessInstance будет соответствовать только текущему экземпляру процесса, а не другому
обрабатывать экземпляры в рабочей памяти. Обратите внимание, что вы, однако, несете ответственность за
вставить экземпляр процесса в сеанс и, возможно, обновить его, например, с помощью Java
код или входное или выходное или явное действие в вашем процессе.
Однако я не могу понять, как сделать то, что описано здесь. Как добавить экземпляр процесса в рабочую память таким образом, чтобы он был доступен для этого первого узла правил? Узлы правил, похоже, не поддерживают поведение при входе, и я не могу добавить его в код Java, поскольку процесс может очень легко завершить выполнение узла правил до , когда рабочая память была обновлена, чтобы включить процесс.