Drools-取消不同FactHandles的规则激活

Drools-取消不同FactHandles的规则激活,drools,kie,Drools,Kie,规则: rule "Accounting_11" dialect "mvel" //For any value of l except given in Accounting_12 salience 1 activation-group "Group l" auto-focus true lock-on-active no-loop true when $iv:Invoice(x in ("D20","D21","D22", "D23", "D24","D25"),y =="E20",

规则:

rule "Accounting_11" dialect "mvel" 
//For any value of l except given in Accounting_12
salience 1 
activation-group "Group l"  
auto-focus true
lock-on-active
no-loop true 
when $iv:Invoice(x in ("D20","D21","D22", "D23", "D24","D25"),y =="E20",z =="F20",a =="G20") 
then modify($iv) { sg.setA("ALL l"), sg.setB("C20")} 
end

rule "Accounting_12"  dialect "mvel" 
//Exceptions of l
salience 2  
activation-group "Group l" 
auto-focus true
lock-on-active
no-loop true 
//Pattern is similar to Accounting_11 with additional constraint "l in (....)"
when $iv:Invoice(l in ("C20","C21","C22", "C23", "C24","C25") , x in ("D20","D21","D22", "D23", "D24","D25"),y =="E20",z =="F20",a =="G20") 
then modify($iv) { sg.setA("Sepcific l"), sg.setB("C20")} 
end
在循环工作记忆中插入2个事实。

==>[ActivationCreatedEvent: getActivation()=[[ Accounting_11 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
    ==>[ActivationCreatedEvent: getActivation()=[[ Accounting_11 active=false ] [ [fact 0:1:2489285:2489285:1:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@25fbc5] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
    ==>[ActivationCreatedEvent: getActivation()=[[ Accounting_12 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
==>[ActivationCancelledEvent: getCause()=CLEAR, getActivation()=[[ Accounting_11 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
==>[ActivationCancelledEvent: getCause()=CLEAR, getActivation()=[[ Accounting_11 active=false ] [ [fact 0:1:2489285:2489285:1:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@25fbc5] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
  • 发票(l=“C20”,x=“D20”,y=“E20”,z=“F20”,a=“G20”)
  • 发票(x=“D20”,y=“E20”,z=“F20”,a=“G20”)
调用fireAllRules()

==>[ActivationCreatedEvent: getActivation()=[[ Accounting_11 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
    ==>[ActivationCreatedEvent: getActivation()=[[ Accounting_11 active=false ] [ [fact 0:1:2489285:2489285:1:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@25fbc5] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
    ==>[ActivationCreatedEvent: getActivation()=[[ Accounting_12 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
==>[ActivationCancelledEvent: getCause()=CLEAR, getActivation()=[[ Accounting_11 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
==>[ActivationCancelledEvent: getCause()=CLEAR, getActivation()=[[ Accounting_11 active=false ] [ [fact 0:1:2489285:2489285:1:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@25fbc5] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
其中一个预期激活被触发

==>[BeforeActivationFiredEvent:  getActivation()=[[ Accounting_12 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
但它会取消所有其他激活。

==>[ActivationCreatedEvent: getActivation()=[[ Accounting_11 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
    ==>[ActivationCreatedEvent: getActivation()=[[ Accounting_11 active=false ] [ [fact 0:1:2489285:2489285:1:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@25fbc5] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
    ==>[ActivationCreatedEvent: getActivation()=[[ Accounting_12 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
==>[ActivationCancelledEvent: getCause()=CLEAR, getActivation()=[[ Accounting_11 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
==>[ActivationCancelledEvent: getCause()=CLEAR, getActivation()=[[ Accounting_11 active=false ] [ [fact 0:1:2489285:2489285:1:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@25fbc5] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
是否应该仅取消为同一事实句柄创建的激活(Invoice@43d432),其中l=C20?

为什么取消为创建的激活Invoice@25fbc5,第二个为“l”的值为空


注意:当我在每次事实插入后触发规则时,我会得到预期的结果。

使用规则属性no loop and lock on active被宣传为简化规则编写,这在一定比例的用例中是正确的。然而,这始终是避免严格应用逻辑的一种方法,逻辑是规则条件的基础。尽管向规则条件添加完整的逻辑可能需要更多的工作,它肯定会创建一个健壮的逻辑,从而实现您真正想要的规则执行

这就是说,由于插入的规则,我看不出会发生什么。显然,会计11和会计12的约束是重叠的,会计12的约束更严格。这总是一个可疑的情况:你希望两种后果都发生还是只发生一种?会计12的存在率更高,因此它会被优先考虑(不考虑字段
l
)的值。如果没有规则属性,我希望其他激活保持活动状态,但如果
锁定处于活动状态,则会取消激活

正如我所说的:在基本约束中描述所需的逻辑是更好的

例如,如果不应为
l
值激活规则,该值在集合“%C20”、“C21”、“C22”、“C23”、“C24”、“C25”定义的范围内,则添加此约束:

$iv:Invoice(l not in ("C20", "C21", "C22", "C23", "C24", "C25"),...)

绝对:规则与事实数据和结果代码相结合的编写方式必然会产生您所描述的效果。看到规则并了解数据会告诉您为什么…@luane,它不应该只针对各自的事实取消其他激活吗?我们可以玩这个游戏数小时甚至数天。您报告说发生了什么事,问为什么,我会告诉你,只有你一个人拥有解释它的所有信息。哈。@luane。很抱歉这个问题不完整。我正在处理激活组并锁定活动。所有规则都属于同一个激活组,锁定活动为真。我将尝试发布规则。我希望Acco修改发票-1解开12.和发票-2将由会计部修改!这澄清了问题。请参阅我的答案,现在编辑。