关于java:drools执行完某个规则后终止别的规则执行

1、背景

在咱们开发的过程中,可能一个场景须要写多个规定,然而某些规定和别的规定又是互斥的关系。即某个规定成立时,不论其余的规定是否成立,其余的规定都不在执行。那么这种场景该如何解决呢?

2、需要

假如咱们有三个规定 rule-01rule-02rule-03,当rule-02执行后,那么rule-03必须终止执行。

3、实现计划

1、通过Fact判断

即当rule-02规定执行后,批改Fact中的某个属性,设置规定已执行,后续规定发现是已执行则不在执行规定。

2、通过全局变量判断

在drools中应用全局变量进行判断。

3、通过halt办法

当咱们在drl文件中调用drools.halt()办法后,它会立刻终止它前面的规定,即前面的规定都不在执行。

此处咱们通过halt办法来实现。

4、实现上述需要

4.1 drl 文件编写

package rules

/**
    需要:在 "rule-01" 和 "rule-02" 规定执行完之后,终止规定 "rule-03" 的执行
*/

rule "rule-01"
    salience 3
    when
    then
        System.out.println(drools.getRule().getName());
end

rule "rule-02"
    salience 2
    when
    then
        System.out.println(drools.getRule().getName());
        // 终止下方的 "rule-03" 规定的执行
        drools.halt();
end

rule "rule-03"
    salience 1
    when
    then
        System.out.println(drools.getRule().getName());
end

上述的规定比较简单,通过salience设置规定的优先级,值越大优先级越高。when前面没有条件,阐明规定都会通过模式匹配,即都可能会执行。然而rule-02规定的then局部有drools.halt(),阐明,该规定执行完之后,它前方激活的规定须要终止执行。

4.2 运行后果

rule-01
rule-02

能够看到rule-03没有输入进去,阐明这个规定被终止执行了。

5、残缺代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-termination-rule

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理