锁定活动不按预期工作

时间:2017-12-14 05:16:44

标签: jboss drools redhat bpm

即使lock-on-active设置为true,也不会触发规则。它应该被解雇一次吗?我希望在使用锁定活动时触发规则1一次。

(注意:我添加了用于执行规则的代码)

规则

rule "Rule 1"

lock-on-active true
ruleflow-group "Group A"

when 
    $c: Product()
then
    System.out.println("Rule 1");
    modify($c)
    {
        setAmount(1);
    }

end


rule "Rule 2" 

lock-on-active true
ruleflow-group "Group A"

when
    $c: Product()
then
    System.out.println("Rule 2");
    modify($c){ 
        setAmount($c.getAmount()+1) 
    }


end 

执行规则的代码

   KieServices kieServices=KieServices.Factory.get();
    KieContainer kieContainer=kieServices.getKieClasspathContainer();
    KieSession kieSession=kieContainer.newKieSession("ksession-lockOnActive");

    Product product=new Product();
    product.setName("Book");
    product.setAmount(5);


    ((InternalAgenda)kieSession.getAgenda()).activateRuleFlowGroup("Group A");

    kieSession.insert(product);
    kieSession.fireAllRules();
    kieSession.dispose();   

1 个答案:

答案 0 :(得分:0)

首先,在将规则用作JBPM中业务流程的一部分时,应使用ruleflow-group属性。最新版本的Drools统一了ruleflow-groupagenda-group的行为,因此您使用哪一个并不重要(即使我建议使用agenda-group)。

然后,您使用激活流程组的方式对我来说似乎不正确。

这就是我要做的事情:

1)在您的规则中使用agenda-group

rule "Rule 1"
lock-on-active true
agenda-group "Group A"
when 
    $c: Product()
then
    ...
end


rule "Rule 2"  
lock-on-active true
agenda-group "Group A"
when
    $c: Product()
then
    ...
end 

2)在触发规则之前,将焦点放在议程组上:

kieSession.getAgenda().getAgendaGroup("Group A").setFocus();
kieSession.fireAllRules();

这应该可以解决问题。

这些规则对我来说仍然很奇怪,但也许是因为你只是做了一个POC。只是提醒一下:您不应该依赖DRL中规则的顺序来获得预期的输出

希望它有所帮助,