gpt4 book ai didi

drools - 从 JBPM 5 中的规则任务访问流程实例

转载 作者:行者123 更新时间:2023-12-03 22:17:16 24 4
gpt4 key购买 nike

短版 : 如何让 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”行要么没有执行,要么正在更新错误的东西。

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

    Rule constraints do not have direct access to variables defined inside the process. It is however possible to refer to the current process instance inside a rule constraint, by adding the process instance to the Working Memory and matching for the process instance in your rule constraint. We have added special logic to make sure that a variable processInstance of type WorkflowProcessInstance will only match to the current process instance and not to other process instances in the Working Memory. Note that you are however responsible yourself to insert the process instance into the session and, possibly, to update it, for example, using Java code or an on-entry or on-exit or explicit action in your process.



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

    最佳答案

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

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

    克里斯

    关于drools - 从 JBPM 5 中的规则任务访问流程实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6992453/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com