Отвод слюней вызывает правило не стрелять - PullRequest
3 голосов
/ 16 июля 2010

Я сталкиваюсь со странным поведением в Drools 4.0.7, но, может быть, это просто потому, что я не понимаю, как работает Drools.Предположим, есть класс «A», у которого есть свойство с именем «property».

В качестве факта у меня есть следующий список A: A1, property = 123 A2, property = 345 A3, property = 123

У меня есть два правила следующим образом:

rule "Rule 1 - Remove all A's that have property set to 123"
  salience 1000
  lock-on-active true
when
  $listOfAs : ArrayList collect(A( property == "123" ))
then
  for (Object a: $listOfAs ) {  
      retract (a)
  }
end

rule "Rule 2 - Do stuff with remaining A's"
  salience 900
  lock-on-active true
when
  $listOfAs : ArrayList collect(A())
then
...
end

Насколько я понимаю, «Правило 1» удалит факты класса А, которые имеют свойство до 123. Когда оно перейдет к «Правилу 2»,не должен ли "listOfAs" иметь только один A, который остается (то есть тот, где свойство установлено в "345").Что я заметил, так это то, что «Правило 2» просто не выполняется вообще, хотя я предполагаю, что есть еще один объект «А», который не был отозван.Если я закомментирую «retract», он прекрасно выполнит «Rule 2.»

Я что-то упустил из-за работы этих правил?

Спасибо.Джастин

1 Ответ

1 голос
/ 10 февраля 2013

Я подозреваю, что проблема здесь заключается в использовании 'lock-on-active'. Учитывая, что первое правило активировано, оно не позволяет активировать другое правило.

Согласно документам, блокировка на активна:

«Логическое значение.« True »запрещает дополнительные активации всех правил с этим флагом, установленным в том же потоке правил или группе повестки дня."

...