drools满足一条规则后不再执行其他规则的解决方案
程序员文章站
2022-03-03 15:51:48
...
背景:
配置了了多个规则,规则引擎在执行的时候会将每一个分支都判断/执行一下一下,假设我们现在有下面两个规则。
rule "prize12221112"
when
$student: Student(score >= 99)
then
$student.getPrize().add("phone");
System.out.println("score >= 99" + $student.getPrize().get(0));
end
rule "prize12221112"
when
$student: Student(score >= 90)
then
$student.getPrize().add("phone");
System.out.println("score >= 90" + $student.getPrize().get(0));
end
规则的含义是学生分数大于99,给一个手机作为奖励;大于90,给一个手机作为奖励。
如果学生分数是100,经过规则引擎后,会有两个手机,这不是产品想要的结果。
怎么保证只得到一个手机?
或者说是当一个规则满足并且执行结果后,其他规则不再生效?
下面是我的解决方案:
rule "prize12221112"
when
$student: Student(result!=1,score >= 99)
then
$student.getPrize().add("phone");
System.out.println("score >= 99" + $student.getPrize().get(0));
$student.setResult(1);
update($student);
end
rule "prize12221112"
when
$student: Student(result!=1,score >= 90)
then
$student.getPrize().add("phone");
System.out.println("score >= 90" + $student.getPrize().get(0));
$student.setResult(1);
update($student);
end
由于这两个规则的优先级没有设置,先走哪一个规则判断是随机的,不管先走哪个,最后都设置一个标识,表示已经有结果了,然后进行下一个规则判断的时候就过不去规则。
这里需要注意的是,虽然我有 $student.setResult(1);但是只有调用下面的update方法,才会将更新的值加载到规则引擎的内存中。
update($student);
另外:
这个方法不太好,因为其他的规则还是会进行判断,不知道谁找到更好的解决方案,类似break或者return的功能。麻烦在留言中告知。