Я новичок в Drools и либо неправильно понимаю, что может делать Drools, либо мне что-то не хватает.
У меня есть простой класс Fact
public class MeterReadTO {
private String status = "";
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public boolean isInvalid() {
return status.equals("invalid");
};
}
С правилами
rule "Rule Invalid"
dialect "mvel"
when
MeterReadTO( isInvalid());
then
System.out.println("Rule Invalid Fired");
end
rule "Rule Not Invalid"
dialect "mvel"
when
not MeterReadTO( isInvalid());
then
System.out.println("Rule Not Invalid Fired");
end
rule "Set Status"
dialect "mvel"
when
$mr: MeterReadTO()
then
System.out.println("Rule Set Status Fires");
modify($mr) {
setStatus("invalid")
}
end
и я запускаю правила с
@RunWith(SpringRunner.class)
@SpringBootTest
public class Dependancy {
static KieSession ksession;
Logger logger = LoggerFactory.getLogger(Dependancy.class);
MeterReadTO mr;
@BeforeClass
public static void start() {
KieContainer kieClasspathContainer = KieServices.Factory.get().getKieClasspathContainer();
ksession = kieClasspathContainer.newKieSession("DependancyTest");
}
@Test
public void contextLoadsAndRetrievesData() {
MeterReadTO mr = new MeterReadTO();
mr.setId(50);
ksession.insert(mr);
// when
ksession.fireAllRules();
ksession.dispose();
// Then
System.out.println("After Drools, status is " + mr.getStatus());
}
}
, и я получаю результат
Rule Not Invalid Fired
Rule Set Status Fires
After Drools, status is invalid
Используя сеанс с сохранением состояния, я ожидалсм. пожар «Недействительное правило» после срабатывания «Правило Set Status».Если я переместлю правило Set Status из нижней части списка правил в верхнюю, то я получу
Rule Set Status Fires
Rule Not Invalid Fired
After Drools, status is invalid
Так что Drools явно не знает об изменении статуса в правиле Set Status.Чего мне не хватает?
С уважением
СЛЕДУЙТЕ ЗА.
Теперь я действительно запутался.Если я удалю вызов метода isInvalid () в моем файле правил и вместо этого буду ссылаться на метод getStatus (), чтобы правила теперь выглядели как
rule "Rule Invalid"
dialect "mvel"
when
MeterReadTO( getStatus() == "ïnvalid");
then
System.out.println("Rule Invalid Fired");
end
rule "Rule Not Invalid"
dialect "mvel"
when
MeterReadTO( getStatus() == "");
then
System.out.println("Rule Not Invalid Fired");
end
rule "Set Status"
dialect "mvel"
when
$mr: MeterReadTO()
then
System.out.println("Rule Set Status Fires");
modify($mr) {
setStatus("ïnvalid")
}
end
, то я получаю вывод, который ожидал
Rule Not Invalid Fired
Rule Set Status Fires
Rule Invalid Fired
After Drools, status is ïnvalid
Кто-нибудь может объяснить, что происходит?