1. 程式人生 > >drools 6.5 決策表使用(轉)

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

原始碼:https://github.com/527515025/DroolsExample