drools 7.x 決策表使用

來源: https://blog.csdn.net/qq_21383435/article/details/82934813

1.何時使用決策表

何時使用決策表——如果規則能夠被表達爲模板+數據的格式,那你 應該考慮使用決策表。決策表中的每一行就是對應模板的一行數據,將產生一個規則。

運行決策表——Drools 引擎所部署的系統中執行決策表。首先,決策錶轉換 成的Drools規則語言(DRL),然後執行規則引擎需求。這意味着它是可能的業務規則的變更,無需停止和啓動,或重新部署任何軟件。

2. 決策表

  1. 決策表是另一種規則的表現形式
  2. 特別是當你的規則有遵循類似的模式或者模板
  3. 希望有這樣一個電子表格視圖管理規則
  4. 實現了規則與數據的分離

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=老年]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章