即使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();
答案 0 :(得分:0)
首先,在将规则用作JBPM中业务流程的一部分时,应使用ruleflow-group
属性。最新版本的Drools统一了ruleflow-group
和agenda-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中规则的顺序来获得预期的输出。
希望它有所帮助,