为什么Drools的冲突解决策略有时会忽略显着性?

时间:2019-10-14 13:23:44

标签: drools

我试图弄清楚Drools的冲突解决策略是如何工作的,即,如果同时有多个匹配的规则,则以什么顺序执行什么规则。在Drools文档中,我只能发现以下几点:执行顺序应为(i)显着性和(ii)通过代码中规则的顺序。但是以下示例似乎显示了相反的情况:

declare Dummy
   val: int
end

rule "1"
salience 100
    when
        exists(Dummy())
    then
        System.out.println(drools.getRule().getName());
end

rule "2"
salience 90
    when
        notDummy(())
    then
        insert(new Dummy(1));
        System.out.println(drools.getRule().getName());
end

rule "3"
salience 80
    when
        // always execute 
    then
        insert(new Dummy(2));
        System.out.println(drools.getRule().getName());
end

rule "4"
salience 70
    when
        $d: Dummy() 
    then
        delete($d); 
        System.out.println(drools.getRule().getName());
end

运行此drl文件(使用Drools 7.14)给出执行顺序2 - 1 - 4 - 2 - 1 - 4 - ...(无限循环,但这里的循环不是问题)。因此,尽管规则3的显着性更高,但规则4的优先级高于规则3!

此外,我观察到当人们删除行时 规则4中的delete($d);的执行顺序为2 - 1 - 3 - 4 - 4!,似乎两个相等匹配的规则的执行顺序取决于它们的右手侧。

有人可以向我解释这种最奇怪的现象吗?对我来说,这完全是无法预测的行为,似乎与Drools文档中有关解决冲突的内容相矛盾?我想有必须是我不知道的一些潜在原因。

0 个答案:

没有答案