如何在不使用NO-LOOP属性的情况下避免Drools中的循环?

时间:2015-01-22 07:28:50

标签: java drools rules

有没有可能的方法来避免循环而不使用Drools的NO-LOOP属性(就像我听说我们可以通过在对象上使用not(!)运算符来实现这一点,但我无法找到它。)

问题是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 个答案:

答案 0 :(得分: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

前段时间,Esteban Aliverti在common patterns for avoiding infinite loops in Drools写了一篇博客文章。值得一读。