2011-08-09 3 views
2

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

ответ

2

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

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

Kr is

+0

Спасибо Kris, добавив задачу сценария, чтобы явно сделать это, устранила проблему. Есть ли причина, по которой процесс автоматически не добавляет себя в рабочую память при входе в узел правил? Похоже, что небольшое преимущество для узла правил, который не может получить доступ к своим переменным процесса, и добавление этих инструкций в процесс смешивает среду исполнения с реальными намерениями бизнеса, что кажется беспорядочным ... – Erica