Drools激活组循环

时间:2017-03-20 18:04:59

标签: drools

在我的场景中,我有两张excel电子表格(sheet1和sheet2),它们包含两个独立的决策表。 在sheet1中,规则如下:

PRIORITY 0
NO-LOOP TRUE
ACTIVATION-GROUP Group1
AGENDA-GROUP Agenda1

    a  b | d
    1  2 | 1

因此,如果a == 1且b == 2,则将d设置为1 设置d的命令是:modify(input) {setD(1)}

Sheet2如下所示:

PRIORITY 5
NO-LOOP TRUE
ACTIVATION-GROUP Group1
AGENDA-GROUP Agenda1

    a  c | d
    1  3 | 1

两个文件都具有相同的ACTIVATION-GROUP(activation1)和相同的AGENDA-GROUP(议程1)

我使用输入:

a  b  c  d
1  2  3  -2

我希望为这两个规则中的每一个创建一个激活。具有较高优先级的规则将触发,然后因为它处于激活组中,第二个规则将被取消。

然而,当我运行时,Sheet1中的规则将被激活并运行,然后Sheet2中的规则将被激活并运行,这将无限循环。

要想一想,这里是会话生成的日志输出的一部分:

==>[ActivationCreatedEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15010_16 active=false ]
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[ActivationCreatedEvent: getActivation()=[[ RuleId15011_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15011_16 active=false ] 
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15011_16 active=false ] 
==>[ActivationCreatedEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15010_16 active=false ]
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[ActivationCreatedEvent: getActivation()=[[ RuleId15011_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15011_16 active=false ] 
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15011_16 active=false ] 
==>[ActivationCreatedEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15010_16 active=false ] 
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15010_16 active=false ] 
==>[ActivationCreatedEvent: getActivation()=[[ RuleId15011_16 active=false ] 
==>[BeforeActivationFiredEvent:  getActivation()=[[ RuleId15011_16 active=false ] 
==>[AfterActivationFiredEvent: getActivation()=[[ RuleId15011_16 active=false ] 

我已经将规则分成两个单独的AGENDA-GROUP,这是一个解决方案,但我想知道为什么activate-group没有做我认为应该做的事情。

有没有人有任何想法为什么这是无限循环?

1 个答案:

答案 0 :(得分:0)

两个规则都被激活,因为所有约束都评估为true。 a-c-d规则具有更高的显着性,因此它会被激发。 a-b-d规则的激活确实被取消,因为它处于相同的激活状态。

现在你使用modify来更新d,它指示引擎重新评估修改后的事实,所以你回到方块1,即两个规则都被激活,具有更高显着性的规则被触发并且...... < / p>

要打破这种恶性循环,写下更准确描述逻辑的规则。三种方式:

(1)仅使用一个规则来设置d = 1。我提供了DRL:

rule abcd
when
  $inp: Input( a == 1, b == 2 || c == 3 )
then
  modify( $inp ){ setD(1) }
end

(2)在d上添加约束条件:

rule abd
when
  $inp: Input( a == 1, b == 2, d != 1 )
then
  modify( $inp ){ setD(1) }
end

即使使用我的第一个提案,在d上添加约束也是一个好主意,因为可能还有其他规则设置输入的e,f,....

(3)如果您在任何规则中都不需要输入.d,您可以执行“更新”#34;,即

rule abd
when
  $inp: Input( a == 1, b == 2 )
then
  $inp.setD(1);
end

最有可能#2最适合您的电子表格方法。