Почему стратегия разрешения конфликтов в Друлах иногда игнорирует значимость? - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь выяснить, как именно работает стратегия разрешения конфликтов 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 о разрешении конфликтов? Я думаю, что должна быть какой-то основной причиной, о которой я не знаю.

...