2010-07-16 2 views
3

Drools 4.0.7에서 이상한 행동을하고 있습니다.하지만 Drools의 작동 방식을 이해하지 못하는 것 같습니다. "속성"이라는 속성이있는 클래스 "A"가 있다고 가정합니다. 사실로Drools 철회로 인해 규칙이 실행되지 않습니다.

, 나는 A의 목록을 다음 있습니다 : 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"은 속성이 123 인 A 클래스의 사실을 제거합니다. "규칙 2"에 도달하면 "listOfAs"에만 해당 A가 남아 있지 않아야합니다 (즉, 속성 "345"로 설정 됨). 내가 눈치 챘을 때, "규칙 2"는 아직 철회되지 않은 "A"객체가 있다고 가정하고 있어도 전혀 실행되지 않는다는 것입니다. "retract"를 주석 처리하면 "Rule 2"가 잘 실행됩니다.

이 규칙에 대한 내용이 누락 되었습니까?

감사합니다. 저스틴

+0

작동 시키셨습니까? Drools 5.4에서도 비슷한 동작을 관찰하고 있습니다. –

답변

1

여기서 문제는 'lock-on-active'를 사용하는 것입니다. 첫 번째 규칙이 활성화 된 경우 다른 규칙도 활성화되지 않습니다.

이 문서에 따르면, 잠금 온 활성 :

". 부울 값을"true "는 동일한 규칙 플로우 또는 일정 그룹 내에서 설정이 플래그 모든 규칙 추가 활성화를 억제한다."

관련 문제