Доступ к экземпляру процесса из Задач Правил в 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

Другие вопросы по тегам