来源: https://blog.csdn.net/qq_21383435/article/details/82934813
1.何时使用决策表
何时使用决策表——如果规则能够被表达为模板+数据的格式,那你 应该考虑使用决策表。决策表中的每一行就是对应模板的一行数据,将产生一个规则。
运行决策表——Drools 引擎所部署的系统中执行决策表。首先,决策表转换 成的Drools规则语言(DRL),然后执行规则引擎需求。这意味着它是可能的业务规则的变更,无需停止和启动,或重新部署任何软件。
2. 决策表
- 决策表是另一种规则的表现形式
- 特别是当你的规则有遵循类似的模式或者模板
- 希望有这样一个电子表格视图管理规则
- 实现了规则与数据的分离
3. 决策表配置
全局配置部分
RuleSet :定义包名
Import :指定导入的class,包括类方法
Variables :指定全局变量
Notes :输入任何内容
Functions :本地方法
RuleTable 部分
CONDITION : 指定单个规则的条件,条件不写的话默认就是==
ACTION : 指定rule的结果
PRIORITY : 指定rule的 salience属性
No-loop : 指定rule的no-loop熟悉
其它更多的配置请参考drools手册 (drools-expert-docs)
关键字 | 说明 | 是否必须 |
---|---|---|
RuleSet | 在单元格中和drl文件中的package一样 | 必须 只能有一个 (如果为空则使用默认值) |
Sequential | 右边的单元格是否可以为true或者false true:代表从表格从上到下,依次执行 false:乱序 | 可选 |
import | 要导入规则库中的类列表,逗号分隔 | 可选 |
functions | 紧挨着的右边单元格,可以包含函数,可以用在规则片段中 drools支持在drl文件中定义函数,并且写到规则中,不用硬代码改变,小心使用,与drl文件中一样。 有返回值,无返回值两种,定义多个函数,逗号分隔写多个函数 | 可选 |
Variables | 紧挨着的右边单元格,可以包含Global声明,格式:类型 变量名(多个变量,逗号分隔) | 可选 |
Queries | 紧挨着的右边单元格,可以包含drools支持的全局声明,格式:类型 查询名称 | 可选 |
RuleTable | 规则名称 格式:RuleTable 规则名称 | 必填 |
关键字
关键字 | 说明 | 是否必须 |
---|---|---|
condition | 指明该列将被用于规则条件,condition代表条件相当于drl文件中的when | 每个规则表至少一个 |
action | 指明该列将被用于推论,简单理解为结果,相遇drl的then,action与condition是平行的 | 每个规则表至少一个 |
priority | 指明该列将被设置规则行的salience值,覆盖Sequential标志,如果在ruleSet设置覆盖了sequential值为true,则priority不起作用,如果squential设置为false或者不设置,则priority生效 | 可选 |
duration | 指明该列的值将被设置为该规则行的期限值,延迟作用和drl文件中一样 | 可选 |
name | 指明该列的值将被设置为从哪行产生的规则名字 | 可选 |
no-loop | 指明这个规则不允许循环,为了这个选项正常运行,这里该单元格中必须是让该选项生效的一个值(true或者false),如果该单元格保持为空,那么这个选项将不会为该行设置 | 可选 |
activation-group | 在这个列的单元格中的值,指定该规则属于特定的XOR/活动组,一个活动组意味着哪个明明组的规则只有一条会被引发 | 可选 |
agenda-group | 一组只有一个执行 | 可选 |
ruleflow-group | 指出该规则属于特定的规则流组 | 可选 |
4.年龄分类小例子
规则如下:
年龄 age <=12 少年
年龄 age >12 && age <=24 青年
年龄 age >24 &&age <=65 中年
年龄 age >65 老年
4.2决策表设计如下
RuleSet : 包名
Import :导入我需要的类,也就是 pojo 对象
Functions : 写了一个函数,主要用于输出
RuleTabel : 写了规则名(随意写)
第6行写了 定义了每一列含义,参考上面给出的表格,查看含义。
第7行写了条件需要用到的对象。
第8行写了判断条件和 执行结果
第9行,写的是每列的定义(没什么用处,我都没有写完。)
第10-13行是我的四个规则。
其中的 美元符号 1,美元符号 2 是传递的参数的占位符。
4.3 pojo对象
public class Person {
private String name;
private int age;
private String desc;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String toString() {
return "[name=" + name + ",age=" + age + ",desc=" + desc + "]";
}
}
4.4 kmodule.xml
如果没有 kmodule.xml 文件,在META-INF 文件夹下新建kmodule.xml 文件填写如下内容。
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<!--决策表-->
<kbase name="PersonAgeKB" packages="com.us.personTemp">
<ksession name="PersonAgeKS"/>
</kbase>
</kmodule>
4.5 test类
public class personTemp {
static KieSession getSession() {
KieServices ks = KieServices.Factory.get();
KieContainer kc = ks.getKieClasspathContainer();
return kc.newKieSession("PersonAgeKS");
}
public static void run(){
KieSession ks = getSession();
Person p1 = new Person("奥巴马", 68);
Person p2 = new Person("普京", 32);
Person p3 = new Person("朴槿惠", 18);
Person p4 = new Person("川普", 10);
Person p5 = new Person("金正恩", 66);
System.out.println("before p1 : " + p1);
System.out.println("before p2 : " + p2);
System.out.println("before p3 : " + p3);
System.out.println("before p4 : " + p4);
System.out.println("before p5 : " + p5);
ks.insert(p1);
ks.insert(p2);
ks.insert(p3);
ks.insert(p4);
ks.insert(p5);
int count = ks.fireAllRules();
System.out.println("总执行了" + count + "条规则------------------------------");
System.out.println("after p1 : " + p1);
System.out.println("after p2 : " + p2);
System.out.println("after p3 : " + p3);
System.out.println("after p4 : " + p4);
System.out.println("after p4 : " + p5);
ks.dispose();
}
public static void main(String[] args) {
run();
}
}
输出
before p1 : [name=奥巴马,age=68,desc=null]
before p2 : [name=普京,age=32,desc=null]
before p3 : [name=朴槿惠,age=18,desc=null]
before p4 : [name=川普,age=10,desc=null]
before p5 : [name=金正恩,age=66,desc=null]
name:金正恩 desc:老年
name:奥巴马 desc:老年
name:普京 desc:中年
name:朴槿惠 desc:青年
name:川普 desc:少年
总执行了5条规则——————————
after p1 : [name=奥巴马,age=68,desc=老年]
after p2 : [name=普京,age=32,desc=中年]
after p3 : [name=朴槿惠,age=18,desc=青年]
after p4 : [name=川普,age=10,desc=少年]
after p4 : [name=金正恩,age=66,desc=老年]