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

How to avoid loops in Drools without using NO-LOOP attribute?

有没有什么方法可以在不使用 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

不确定为什么有些人如此害怕无循环。它的存在是有充分理由的。即如果重新评估的原因是由于规则中的修改或插入,它指示引擎不要重新评估规则。

但是,您可以通过自己的逻辑手动完成。只需插入一个适当的事实并匹配它不存在。

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 上写了一篇博客 post。值得一读。