【发布时间】:2015-06-11 09:21:24
【问题描述】:
我有一个对象如下:
class License{
private field1;
private field2;
private boolean active;
private String activeMessage;
private boolean processed = false;
//Getter and setter methods
}
我要做的是,根据 field1 和 field2 的值,我需要设置 isActive 标志和相应的消息。但是,如果 field1 或 field2 的规则被触发,我需要停止规则处理。也就是说,我只需要执行一条成功的规则。
我在一篇文章中读到,执行 ksession.fireAllRules(1) 将解决此问题。但是 fireAllRules() 方法在 Drools 6 中不可用。我也尝试过返回;在每条规则的末尾声明。这对我也没有帮助。
最后,我最终向我的对象添加了一个名为已处理的附加字段。因此,每当我执行任何规则时,我都会将已处理标志设置为 true。如果标志已经设置,那么我不执行任何规则。这是我的规则文件:
rule "Check field1"
when
$obj : License(getField1() == "abc" && isProcessed() == false)
then
System.out.println("isProcessed >>>>>> "+$obj.isProcessed());
$obj.setActive(true);
$order.setActiveMessage("...");
$order.setProcessed(true);
end
rule "Check field2"
when
$obj : License(getField2() == "def" && isProcessed() == false)
then
System.out.println("isProcessed >>>>>> "+$obj.isProcessed());
$obj.setActive(true);
$order.setActiveMessage("...");
$order.setProcessed(true);
end
但是,我发现即使现在我的两条规则都被解雇了。当我尝试打印 isProcessed() 的值时,它显示为 true,即使我仅在 isProcessed() 为 false 时才输入规则。
这就是我对 drools 引擎的称呼:
kieService = KieServices.Factory.get();
kContainer = kieService.getKieClasspathContainer();
kSession = kContainer.newStatelessKieSession();
kSession.execute(licenseObj);
不只是2条规则,我有很多规则,所以不能通过改变drl文件中规则的顺序来控制规则的执行。这里发生了什么?我怎么解决这个问题?我对 Drools 有点陌生,所以我可能在这里遗漏了一些东西。
谢谢。
【问题讨论】:
标签: drools