首页 文章

Drools激活组循环

提问于
浏览
0

在我的场景中,我有两个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

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

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

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

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

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

    (2)在两个规则上添加对约束的约束:

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

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

    (3)如果你的任何规则中不需要Input.d,你可以进行“脏更新”,即

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

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

相关问题