來源: 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=老年]