Есть ли какой-либо возможный способ избежать цикла без использования атрибута NO-LOOP для Drools (Как я слышал, мы можем достичь этого, используя оператор 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
Не знаю, почему некоторые люди так боятся no-loop. Это существует по вполне веской причине. т.е. Он инструктирует движок не переоценивать правило, если причина такой переоценки обусловлена модификациями или вставками в этом правиле.
Однако вы можете сделать это вручную через свою собственную логику. Просто вставьте соответствующий факт и совпадение с ним не существует.
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
Некоторое время назад Эстебан Аливерти написал сообщение в блоге об общих шаблонах, чтобы избежать бесконечных циклов в Drools. Это стоит прочитать.