Drools-多个规则触发,即使它们都属于同一激活组

Drools-多个规则触发,即使它们都属于同一激活组,drools,Drools,我有一套规则如下: rule "Default Margin By Grade" ruleflow-group "MarginByGrade" enabled false when $mg : MarginByGrade() $u : PriceUnit( resale==null, trimGrade memberOf $mg.grades ) then end rule "Grade Margin By Group, Style" extends "Defaul

我有一套规则如下:

rule "Default Margin By Grade"
ruleflow-group "MarginByGrade"
enabled false
when
    $mg : MarginByGrade()
    $u  : PriceUnit( resale==null, trimGrade memberOf $mg.grades  )
then    
end

rule "Grade Margin By Group, Style" extends "Default Margin By Grade"
activation-group "Margin By Grade"
salience 500
when
    MarginByGrade(this == $mg, $u.model memberOf $mg.models,  $u.style memberOf $mg.styles)
then
    System.out.println("Found match : " + $mg);
end

rule "Grade Margin By Style" extends "Default Margin By Grade"
activation-group "Margin By Grade"
salience 100
when
    MarginByGrade(this == $mg, models == null, $u.style memberOf $mg.styles)
then
    System.out.println("Found match : " + $mg);
end

rule "Grade Margin By Group" extends "Default Margin By Grade"
activation-group "Margin By Grade"
salience 50
when
    MarginByGrade(this == $mg, prefixes memberOf prefixes, styles == null)
then
    System.out.println("Found match : " + $mg);
end

rule "Margin by Grade" extends "Default Margin By Grade"
salience 5
activation-group "Margin By Grade"
when
    MarginByGrade(this == $mg, prefixes == null, styles == null)
then
    System.out.println("Found match : " + $mg);
end
规则是基于规则流触发的(因此是“ruleflow group”属性)。我的要求是,一旦启动具有最高显著性的规则,则不应启动具有较低显著性的规则。但是,当我运行时提供了一个激活多个规则的事实,所有激活的规则都会被触发:

Start Process: Mon Sep 19 15:58:39 EDT 2011
Found match : MarginByGrade( prefixes=null, styles=null, grades=[C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S], margin=26.0000 )
Found match : MarginByGrade( prefixes=[015, 215], styles=[572], grades=[A, B, D], margin=25.5000 )
Found match : MarginByGrade( prefixes=[015, 010], styles=[515, 215, 572], grades=[C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S], margin=24.5000 )
015572  D 015572  D933079 FN 175->null
Dispose Session: Mon Sep 19 15:58:39 EDT 2011

我做错了什么?我使用的是Drools Expert 5.2.0-Final。

您使用的是激活组,而不是规则流组,对吗?。激活组将导致仅执行一条规则,正如您所说,如果激活,将执行显著性更高的规则。 干杯

无状态会话:

在处理事实集合和无状态会话时,请注意激活组,因为只有一个规则将触发,它将跳过其他事实。
最好的解决方案是在事实上使用显著性和已处理标志

激活组将为单个
MarginByGrade


从控制台输出中,您至少有3个
MarginByGrade
,因此为这3个
MarginByGrade

中的每一个触发不同的规则是正确的。谢谢您的回答。我只希望触发一个规则(具有最高显著性的规则)。那么哪一个是正确的:激活组还是规则流组??不确定规则流,但激活组充当一个独占组,您可以使用它来解决上述问题。引用文档:属于同一激活组的规则(由该属性的字符串值标识)将只以独占方式激发。在其他情况下换句话说,激活组中要触发的第一条规则将取消其他规则的激活,即阻止它们触发。