2010-07-16 3 views
3

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

Как факты, у меня есть список элементов а следующее: A1, свойство = 123 A2, свойство = 345 A3, свойство = 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» штраф.

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

Спасибо. Justin

+0

У вас получилось работать? Я также наблюдаю подобное поведение в Drools 5.4. –

ответ

1

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

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

«Логическое значение„истина“ингибирует дополнительные активации всех правил с этим установленным флагом в пределах той же группы или ruleflow дня.»

 Смежные вопросы

  • Нет связанных вопросов^_^