Drools规则引擎技术指南
上QQ阅读APP看书,第一时间看更新

4.4 属性salience

默认值:0。

类型:integer。

属性说明:规则体被执行的顺序,每一个规则都有一个默认的执行顺序,如果不设置salience属性,规则体的执行顺序为由上到下。salience值可以是一个整数,但也可以是一个负数,其值越大,执行顺序越高,排名越靠前。Drools还支持动态配置优先级。

创建规则文件salience.drl,目录为rules/isSalience,其内容为:

package rules.isSalience

rule "testSalience1"
salience 10
    when
    then
       System.out.println("hello testSalience1");
end

rule "testSalience2"
salience 20
    when
    then
       System.out.println("hello testSalience2");
end

rule "testSalience3"
salience 5
    when
    then
       System.out.println("hello testSalience3");
end

修改kmodule.xml配置文件,并添加如下配置:

<kbase name="isSalience" packages="rules.isSalience">
    <ksession name="isSalience"/>
</kbase>

创建RulesSalience.java文件,目录为com.rulesAttributes,其内容为:

package com.rulesAttributes;

import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class RulesSalience {
    @Test
    public void testSalience () {
        KieServices kss = KieServices.Factory.get();
        KieContainer kc = kss.getKieClasspathContainer();
        KieSession ks = kc.newKieSession("isSalience");
        int count = ks.fireAllRules();
        System.out.println("总执行了" + count + "条规则");
        ks.dispose();
    }
}

执行testSalience()方法,结果如图4-8所示。

076-1

图4-8 salience属性的效果

属性说明中提到Drools支持动态salience,因此编辑规则文件salience.drl,并添加testSalience4规则,其内容为:

rule "testSalience4"
salience (Math.random() * 10 + 1)
    when
    then
       System.out.println("hello testSalience4");
end

再一次执行testSalience()方法,结果如图4-9所示。

077-1

图4-9 salience属性的随机效果