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

 

 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值