我试图弄清楚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文档中有关解决冲突的内容相矛盾?我想有必须是我不知道的一些潜在原因。