如何在不使用 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。值得一读。
有没有什么方法可以在不使用 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。值得一读。