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

时间:2011-09-19 20:05:43

标签: 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 "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。

3 个答案:

答案 0 :(得分:3)

您使用的是激活组而不是规则流组吗?激活组将导致只执行一条规则,如果激活,则会执行具有较高显着性的规则。 干杯

答案 1 :(得分:0)

无国籍会议:

如果您正在处理事实收集和无状态会话,请注意激活组,因为只有一个规则会触发,它会跳过其他事实。 最佳解决方案是使用Salience和事实处理标志

答案 2 :(得分:0)

激活组将针对单个MarginByGrade触发一次

从控制台输出中,至少有3个MarginByGrade,因此为这3个MarginByGrade中的每一个激发不同的规则是正确的