Доступ к экземпляру процесса из Задач Правил в JBPM 5
Краткая версия: Как я могу заставить Узлы Правил JBPM5 использовать файл DRL, который читает и обновляет переменные процесса?
Длинная версия: у меня есть определение процесса, работающее под JBPM5. Начало этого процесса выглядит примерно так:
[Пуск] ---> [Узел правил] ---> [Шлюз (Дивергенция)] ... и т. Д.
Шлюз использует ограничения для переменной с именем isValid.
Мой узел правил указывает на RualFlowGroup 'validate', которая содержит только одно правило:
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, потому что процесс может очень легко завершить выполнение узла правил до того, как рабочая память будет обновлена, чтобы включить процесс.
1 ответ
Как вы упомянули, существует несколько вариантов вставки экземпляра процесса в рабочую память: - вставка его после вызова startProcess() - использование сценария действия для его вставки (с использованием "insert(kcontext.getProcessInstance()")
Если вызов startProcess (), возможно, уже прошел задачу правила (что, вероятно, имеет место в вашем примере), и у вас нет другого узла перед задачей правила, где вы могли бы просто использовать скрипт при входе / выходе чтобы сделать это (так что это скрыто), я бы порекомендовал использовать явную задачу скрипта перед задачей правила, чтобы сделать это.
Kris