有没有可能的方法来避免循环而不使用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
答案 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写了一篇博客文章。值得一读。