天天看點

drools 6.5 -規則引擎入門1. Drools2. Drools 規則引擎原理3. 入門例子

本文結構:

1. Drools

2. Drools 規則引擎原理

3. 入門例子

1. Drools

Drools 具有一個易于通路企業政策、易于調整以及易于管理的開源業務 規則引擎,符合業内标準,速度快、效率高。業務分析師或稽核人員可以利用它輕松檢視業務規則,進而檢驗已編碼的規則是否執行了所需的業務規則。其前身是 Codehaus 的一個開源項目叫 Drools,最近被納入 JBoss 門下,更名為 JBoss Rules,成為了 JBoss 應用伺服器的規則引擎。

目前,Drools 支援四種規則描述檔案,分别是:drl 檔案、 xls 檔案、brl 檔案和 dsl 檔案,其中,常用的描述檔案是 drl 檔案和 xls 檔案,而 xls 檔案更易于維護,更直覺,更為被業務人員所了解。

2. Drools 規則引擎原理

Drools 中的 Rete 算法被稱為 ReteOO,表示 Drools 為面向對象系統(Object Oriented systems)增強并優化了 Rete 算法。

在 Drools 中,規則被存 放在 Production Memory(規則庫)中,推理機要比對的 facts(事實)被存在 Working Memory(工作記憶體)中。當時事實被插入到工作記憶體中後,規則引擎會把事實和規則庫裡的模式進行比對,對于比對成功的規則再由 Agenda 負責具體執行推理算法中被激發規則的結論部分,同時 Agenda 通過沖突決策政策管理這些沖突規則的執行順序,Drools 中規則沖突決策政策有:

(1) 優先級政策

(2) 複雜度優先政策

(4) 廣度政策

(5) 深度政策

(6) 裝載序号政策

(7) 随機政策

drools 原理示意圖

drools 6.5 -規則引擎入門1. Drools2. Drools 規則引擎原理3. 入門例子

3. 入門例子

計算年齡小例子

age> 0 少年

age> 12 青年

age> 24 中年

age > 60 && age <80 老年

建立maven 項目,然後添加pom.xml依賴

小例子分五步

1. pom.xml 檔案

2. pojo 類

3. rule.drl 檔案

4. kmodel.xml

5. test檢測

3.1pom.xml 檔案如下。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.us</groupId>
    <artifactId>droolsDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- drools -->
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>6.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>6.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>6.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-decisiontables</artifactId>
            <version>6.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>6.5.0.Final</version>
        </dependency>
        <!--log4j-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
</project>
           

3.2 pojo

package com.us.person;

/**
 * Created by yangyibo on 16/12/7.
 */
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 + "]";
    }
}
           

3.3 rule.drl

rule.drl

package com.us.person;

import com.us.person.Person;


        function void printName(String name,String desc) {
            System.out.println("name:"+name+" desc:"+ desc);
        }


        rule "boy"
            salience 
            when
                $p : Person(age > );
            then
                $p.setDesc("少年");
                retract($p);
                printName($p.getName(),$p.getDesc());
        end

        rule "youth"
            salience 
            when
                $p : Person(age > );
            then
                $p.setDesc("青年");
                retract($p);
                printName($p.getName(),$p.getDesc());
        end

        rule "midlife"
            salience 
            when
                $p : Person(age > );
            then
                $p.setDesc("中年");
                retract($p);
                printName($p.getName(),$p.getDesc());
        end

        rule "old"
        lock-on-active true

          salience 
            when
                $p : Person(age >  && age <)

            then
                $p.setDesc("老年");
                update($p);
                printName($p.getName(),$p.getDesc());
        end


           

3.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="SimpleRuleKBase" packages="com.us.person">
        <ksession name="simpleRuleKSession"/>
    </kbase>
    </kmodule>
           

3.5 test

package com.us.person;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;



/**
 * Created by yangyibo on 16/12/7.
 */
public  class PersonTest {
    static KieSession getSession() {



        KieServices ks = KieServices.Factory.get();

        KieContainer kc = ks.getKieClasspathContainer();


        return kc.newKieSession("simpleRuleKSession");
    }


    public static void run() {

            KieSession ks = getSession();

            Person p1 = new Person("白展堂", );
            Person p2 = new Person("李大嘴", );
            Person p3 = new Person("佟湘玉", );
            Person p4 = new Person("郭芙蓉", );
            Person p5 = new Person("祝無雙", );

            System.out.println("before p1 : " + p1);
            System.out.println("before p2 : " + p2);
            System.out.println("before p3 : " + p3);
            System.out.println("before p4 : " + p4);
            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=8,desc=null]

name:祝無雙 desc:老年

name:白展堂 desc:老年

name:祝無雙 desc:中年

name:李大嘴 desc:中年

name:白展堂 desc:中年

name:佟湘玉 desc:青年

name:郭芙蓉 desc:少年

總執行了7條規則——————————

after p1 : [name=白展堂,age=68,desc=中年]

after p2 : [name=李大嘴,age=32,desc=中年]

after p3 : [name=佟湘玉,age=18,desc=青年]

after p4 : [name=郭芙蓉,age=8,desc=少年]

after p4 : [name=祝無雙,age=66,desc=中年]