Drools 6.0入門:時鐘執行個體

來源:互聯網
上載者:User

關於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型,無預設值

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.