drools 6.5 决策表使用
drools 决策表的使用。
本文结构
- 1.何时使用决策表
- 2.决策表
- 3.决策表配置
- 4.年龄分类小例子
何时使用决策表
何时使用决策表——如果规则能够被表达为模板+数据的格式,那你 应该考虑使用决策表。决策表中的每一行就是对应模板的一行数据,将产生一个规则。
运行决策表——Drools 引擎所部署的系统中执行决策表。首先,决策表转换 成的Drools规则语言(DRL),然后执行规则引擎需求。这意味着它是可能的业务规则的变更,无需停止和启动,或重新部署任何软件。
决策表
决策表是另一种规则的表现形式
特别是当你的规则有遵循类似的模式或者模板
希望有这样一个电子表格视图管理规则
实现了规则与数据的分离
决策表配置
全局配置部分
RuleSet:定义包名
Import:指定导入的class,包括类方法
Variables:指定全局变量
Notes:输入任何内容
Functions:本地方法
RuleTable 部分
CONDITION:指定单个规则的条件,条件不写的话默认就是==
ACTION:指定rule的结果
PRIORITY:指定rule的 salience属性
No-loop:指定rule的no-loop熟悉
其它更多的配置请参考drools手册 (drools-expert-docs)
例子,此处例子大家可以大致看一下,下面会有详细例子
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 + "]";}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
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();}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
输出
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=老年]
参考资料:http://blog.csdn.net/u013115157/article/details/52025744
源码:https://github.com/527515025/DroolsExample