【发布时间】:2019-03-07 09:52:38
【问题描述】:
我是 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 规则从规则列表的底部移到顶部,那么我得到
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
谁能解释发生了什么?
【问题讨论】:
标签: drools