Доступ к экземпляру процесса из задач правил в JBPM 5 - PullRequest
2 голосов
/ 09 августа 2011

Краткая версия : Как заставить узлы правил 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, поскольку процесс может очень легко завершить выполнение узла правил до , когда рабочая память была обновлена, чтобы включить процесс.

1 Ответ

2 голосов
/ 10 августа 2011

Как вы упомянули, есть несколько вариантов вставки экземпляра процесса в рабочую память: - вставка его после вызова startProcess () - использование сценария действия для его вставки (с использованием «insert (kcontext.getProcessInstance ()»)

Если вызов startProcess (), возможно, уже прошел задачу правила (что, вероятно, имеет место в вашем примере), и у вас нет другого узла перед задачей правила, где вы могли бы просто использовать on-вход / выход из сценария, чтобы сделать это (так что это скрыто), я бы порекомендовал использовать явную задачу сценария перед задачей правила, чтобы сделать это.

Kris

...