我有一套规则如下:
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。
答案 0 :(得分:3)
您使用的是激活组而不是规则流组吗?激活组将导致只执行一条规则,如果激活,则会执行具有较高显着性的规则。 干杯
答案 1 :(得分:0)
无国籍会议:
如果您正在处理事实收集和无状态会话,请注意激活组,因为只有一个规则会触发,它会跳过其他事实。 最佳解决方案是使用Salience和事实处理标志
答案 2 :(得分:0)
激活组将针对单个MarginByGrade
触发一次
从控制台输出中,至少有3个MarginByGrade
,因此为这3个MarginByGrade
中的每一个激发不同的规则是正确的