2015-01-22 2 views
1

Drools의 NO-LOOP 속성을 사용하지 않고 루핑을 피할 수있는 방법이 있습니까? 객체에 not 연산자 (!)를 사용하여 찾을 수 있지만 들키지 못하는 것 같아요.)NO-LOOP 속성을 사용하지 않고 Drools에서 루프를 피하는 방법은 무엇입니까?

문제는 NO-LOOP 속성을 사용할 수 없다. (이므로 ) 아래 규칙을 참조하고 루핑을 피할 수 있는지 알려준다.

TestClass.java

public class TestClass{ 
    private String name; 
    private int age; 

// Few other variables 
// their getters and setters 

} 

규칙

rule "abc" 
    when 
     $obj : TestClass(name=="test", age != 20) 
    then 
     TestClass $obj2 = new TestClass(); 
     $obj2.setName("test"); 
     $obj2.setAge(30); 
     insert($obj2); 
end 
+1

루프를 피하는 가장 좋은 전략은 RHS 코드에 의해 달성 된 값을 잡는 제약 조건을 포함시키는 것입니다. – laune

답변

2

일부 사람들은 더 루프 너무 두려워하는 이유는 확실하지. 그것은 완벽한 이유가 있기 위해 존재합니다. 즉, 재평가 이유가 규칙에 수정 또는 삽입 된 경우 엔진이 규칙을 재평가하지 않도록 지시합니다.

그러나 자신의 논리를 통해 수동으로 수행 할 수 있습니다. 해당 사실을 삽입하고 기존 사실이 일치하지 않습니다.

declare IsTested 
    name: String 
end 

rule "abc" 
when 
    $obj : TestClass($name: name=="test", age != 20) 
    not IsTested(name == $name) 
then 
    TestClass $obj2 = new TestClass(); 
    $obj2.setName("test"); 
    $obj2.setAge(30); 
    insert($obj2); 
    insert(new IsTested($name)); 
end 

는 다시 반면, 에스테반 Aliverti는 common patterns for avoiding infinite loops in Drools에 블로그에 글을 남긴 바있다. 그것은 읽을만한 가치가 있습니다.

+0

감사합니다. @ 스티브 - 완벽하게 잘 작동합니다. Excel 시트를 실제로 사용하고 있었으므로 Excel 시트를 사용하여이를 구현하는 방법을 알아내는 데 시간이 걸렸습니다. –

+0

다른 솔루션의 장단점을 보려면 주제에 대한 Esteban의 블로그를 권 해드립니다. https://ilesteban.wordpress.com/2012/11/16/about-drools-and-infinite-execution-loops/ –

+0

잘 기억합니다. Davide ... 대답에 대한 링크를 추가했습니다. – Steve

관련 문제