關於Drools 6.0的博文,寫了很長時間。一方面是最近比較散漫,雖然也學了不點擊開啟連結少新的東西,但是不太願意記錄下來;另一方面是Drools本身比較繁瑣,即便是入門也需要涉及很多內部的東西,越寫越覺得動力不足。本文已經是第三次從頭開始寫的了。
首先介紹一下Drools。Drools是一個基於Java實現的規則引擎開源庫,由JBoss基金會管理,最新的是6.0.1版本。6.0版本中,Drools推出了一套新的基於KIE概念的API,其目的是將之前版本中對規則引擎繁瑣的調用和載入過程加以簡化,效果拔群。
目前網上關於Drools 6.0的資料相對較少。以下是本人搜尋到的兩個較好的教程,以供學習:
http://blog.xiongzhijun.com/?cat=48(中文,Drools入門教程,涉及了很多Drools的基礎概念、結構與文法)
http://docs.jboss.org/drools/release/6.0.1.Final/drools-docs/html_single/index.html(英文,6.0.1官方指南,涉及Drools的方方面面,適合進階學習)
http://blog.csdn.net/quzishen/article/details/6163012(中文,5.x版本,可用於對照,且其中對DRL規則檔案的講解可供學習)
以下是本人編寫的一個基於Drools 6.0實現的時鐘的執行個體。
Java代碼:
src/main/java/com.ibm.clock.Clock.java
package com.ibm.clock;public class Clock {private int hour;private int minute;private int second;public int getHour() {return hour;}public void setHour(int hour) {this.hour = hour;}public int getMinute() {return minute;}public void setMinute(int minute) {this.minute = minute;}public int getSecond() {return second;}public void setSecond(int second) {this.second = second;}@Overridepublic String toString() {return hour + ":" + minute + ":" + second;}}
src/main/java/com.ibm.clock.ClockTest.java
package com.ibm.clock;import org.kie.api.KieServices;import org.kie.api.runtime.KieContainer;import org.kie.api.runtime.KieSession;public class ClockTest {public static void main(String[] args) {KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession("session-clock"); kSession.insert(new Clock()); kSession.fireAllRules(); kSession.dispose(); }}
DRL規則檔案:
src/main/resources/clock/clock.drl
package com.ibm.clockrule "run"salience 1when c: Clock(!(hour == 1 && second == 1))thenSystem.out.println(c);Thread.sleep(1000);c.setSecond(c.getSecond() + 1);update(c);endrule "second"salience 2whenc: Clock(second == 60);thenc.setMinute(c.getMinute() + 1);c.setSecond(0);update(c);endrule "minute"salience 3whenc: Clock(minute == 60)thenc.setHour(c.getHour() + 1);c.setMinute(0);update(c);end
Drools設定檔:
src/main/resources/META-INF/kmodule.xml
<?xml version="1.0" encoding="UTF-8"?><kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="clock" packages="clock"> <ksession name="session-clock" /> </kbase></kmodule>
需要說明的是:
1. 上述代碼中有關Drools的功能類以及kmodule.xml設定檔中的標籤的說明都可以在上面的兩個連結的教程中找到;
2. Drools項目本身是一個maven項目,所以src/main/resources/META-INF/maven/pom.properties檔案必須要有,而且已經設定groupId、artifactId、version的值,否則會出現NullPointerException異常;如果通過Eclipse建立Drools項目,maven的相關屬性在創新過程中會要求填寫,否則無法建立項目;
3. DRL規則檔案在when之前可以設定的屬性如下所示:
no-loop:在DRL的then子句中,如果出現insert、update、modify、retract等方法對執行個體(Fact)做出修改時,當前規則執行完成後會觸發該規則使其再執行一次;將no-loop設定為true則會強制規則在出現上述方法的情況下也只執行一次
boolean型,預設值為false
ruleflow-group:基於ruleflow將規則分組
string型,無預設值
lock-on-active:規則可能會被其它規則調用而反覆執行;將lock-on-active置為true可以強制使規則在任何條件下都只會執行一次,可視為no-loop的加強版
boolean型,預設值為false
salience:設定當前這條規則的執行優先順序,數字越小優先順序越高
int型,預設值為0
agenda-group:基於Agenda將規則分組;只有當某個Agenda組擷取到焦點(focus)時,該組的規則才會被執行
string型,預設值為MAIN
auto-focus:與agenda-group配合使用,設定焦點的是否可以自動擷取
boolean型,預設值為false
activation-group:不基於任何條件將規則分組
string型,無預設值
dialect:設定規則所使用的語言
string型,預設值根據package值判斷,範圍為java或mvel
data-effective:當前規則的生效時間
string型,無預設值;值中需包含日期和時間
data-expires:當前規則的失效時間
string型,無預設值;值中需包含日期和時間
duration:設定DRL檔案開始執行之後延遲多長時間開始執行這條規則
long型,無預設值