本文結構:
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 原理示意圖

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=中年]