drools 6.5 決策表使用(轉)
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