Я пытаюсь выяснить, как именно работает стратегия разрешения конфликтов 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 - ...
(бесконечный цикл, но цикл здесь не является проблемой). Таким образом, правило 4 имеет более высокий приоритет, чем правило 3, хотя правило 3 имеет более высокую значимость!
Кроме того, я заметил, что при удалении строки delete($d);
из правила 4 порядок выполнения равен 2 - 1 - 3 - 4 - 4!
Кажется, что порядок выполнения двух одинаково совпадающих правил зависит от их правых частей.
Может ли кто-нибудь объяснить мне это самое странное, для меня совершенно непредсказуемое поведение, которое, кажется, противоречит тому, что написано в документации Drools о разрешении конфликтов? Я думаю, что должна быть какой-то основной причиной, о которой я не знаю.