drools满足一条规则后不再执行其他规则的解决方案

 

背景:

配置了了多个规则,规则引擎在执行的时候会将每一个分支都判断/执行一下一下,假设我们现在有下面两个规则。

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的功能。麻烦在留言中告知。

 

 

你可能感兴趣的:(规则引擎)