Втягивание слюни приводит к тому, что правило не срабатывает

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

В качестве фактов у меня есть следующий список 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» удалит факты класса A, у которых свойство равно 123. Когда он перейдет к «Правилу 2», не должен ли «listOfAs» ​​иметь только тот один A, который остается (то есть тот, где свойство равно установлен на "345"). Я замечаю, что «Правило 2» вообще не выполняется, хотя я предполагаю, что есть еще один объект «А», который не был отозван. Если я закомментирую «отзыв», он выполняет штраф «Правило 2».

Мне что-то не хватает в работе этих правил?

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


person 12983    schedule 16.07.2010    source источник
comment
У тебя это сработало? Я наблюдаю подобное поведение и в Drools 5.4.   -  person Tushar Tarkas    schedule 28.02.2013


Ответы (1)


Я подозреваю, что проблема здесь в использовании блокировки по активному. Поскольку первое правило активировано, оно предотвращает активацию другого правила.

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

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

person Steve    schedule 10.02.2013