2

简短版本:如何让 JBPM5 规则节点使用读取和更新流程变量的 DRL 文件?

长版:我有一个流程定义,在 JBPM5 下运行。这个过程的开始看起来像这样:

[开始] ---> [规则节点] ---> [网关(分歧)] ...等

网关对名为“isValid”的变量使用约束。

我的规则节点指向 RuleFlowGroup '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 文件正在加载到工作内存中,因为当我将语法错误放入文件中时,我会收到错误。
  • 如果我在 Java 参数映射中包含“isValid”的值,则该过程只会遵循 Java 指定的路径,显然忽略了流口水规则。
  • 如果我从 params 映射中取出“isValid”参数,则会出现运行时错误。

由此我假设规则中的最后一个“setVariable”行要么没有执行,要么正在更新错误的东西。

我认为我的问题与官方文档中的这个声明有关:

规则约束不能直接访问流程内定义的变量。但是,可以通过将流程实例添加到工作内存并匹配规则约束中的流程实例来引用规则约束内的当前流程实例。我们添加了特殊的逻辑来确保 WorkflowProcessInstance 类型的变量 processInstance 只匹配当前流程实例,而不匹配工作内存中的其他流程实例。但是请注意,您自己负责将流程实例插入到会话中,并可能更新它,例如,使用 Java 代码或流程中的进入或退出或显式操作。

但是我无法弄清楚如何做这里描述的事情。如何将流程实例添加到工作内存中,以使其可供第一个规则节点访问?规则节点似乎不支持进入行为,并且我无法将其添加到 Java 代码中,因为在工作内存被更新以包含该进程之前,该进程可以很容易地完成规则节点的执行。

4

1 回答 1

2

正如您所提到的,将流程实例插入工作内存有多种选择: - 在调用 startProcess() 后插入 - 使用操作脚本插入它(使用“insert(kcontext.getProcessInstance()”)

如果调用 startProcess() 可能已经完成了规则任务(在您的示例中可能就是这种情况),并且您的规则任务前面没有另一个节点,您可以只使用进入/退出脚本要做到这一点(所以这是隐藏的),我建议在您的规则任务之前使用显式脚本任务来执行此操作。

克里斯

于 2011-08-10T13:06:09.613 回答