Drools 7.31 все еще поддерживает механизм 'extends'. Проблема здесь в том, что при расширении базового правила базовое правило срабатывает. (Это отчасти очевидно; если базовое правило недействительно для стрельбы, то дочернее правило недействительно для стрельбы. Если база является действительной для стрельбы , то она срабатывает. И когда запускается дочернее правило, также запускается родительское правило.)
Традиционный способ обойти это - использовать три правила. «Базовое» правило не должно иметь никаких последствий (то есть не должно быть правой части / затем предложения), поэтому оно просто перечисляет общие условия. Тогда последствия «супер» правила заключаются в правиле, которое расширяет базовые правила, не имеет никаких дополнительных условий «когда» и имеет предложение then как нормальное. И правило «sub» также расширяет «base», включает его дополнительные условия, а затем и свои собственные последствия. Если вы не хотите, чтобы «super» срабатывал, когда «sub» делает, вы делаете их взаимоисключающими.
Вот намеренно упрощенный пример:
rule "Base Rule"
when
$person: Person( $input: input != null )
PersonInput( $id: personId in (1, 2) )
then
// intentionally no 'then' clauses
end
rule "Super" extends "Base Rule"
when
// No additional conditions, just use whatever is in Base Rule
then
System.out.println("Person has id: " + $id);
end
rule "Sub" extends "Base Rule"
when
PersonInput( householdId == "99999") from $input
then
System.out.println("Household ID is 99999; id: " + $id);
end
Теперь, если мы этого не сделаем если «Super» срабатывает, когда «Sub» делает, мы просто делаем его взаимоисключающим из «Sub»:
rule "Super" extends "Base Rule"
when
// This is the condition from Sub, inverted:
PersonInput( householdId != "99999" ) from $input
then
System.out.println("Person has id: " + $id);
end
По сути, когда вы расширяете правило, вы расширяете оба, когда и тогдашние пункты. Предложение (последствия) родительского правила then
сработает раньше, чем последствия дочернего правила. Кроме того, если ребенок недействителен, но родитель есть, вы все равно уволите родителя. Таким образом, если у вас есть, скажем, 3 дочерних правила и родительское правило, родитель может быть запущен до 4 раз: один раз, когда он оценивается сам по себе, и затем еще 3 раза один раз для оценки дочернего элемента. Ситуация становится особенно странной, когда вы используете сеансы с состоянием и предложения update
/ insert
.
Шаблон базового правила «без последствий», который я показал, развился из этой реальности. Следуя этой схеме, не имеет значения, сколько раз срабатывает «Базовое правило», потому что нет никаких побочных эффектов (последствия / затем предложение).