1、Drools是什么?
Drools 是一個(gè)基于Charles Forgy's的Rete算法的,專為Java語(yǔ)言所設(shè)計(jì)的規(guī)則引擎。Rete算法應(yīng)用于面向?qū)ο蟮慕涌趯⑹够谏虡I(yè)對(duì)象的商業(yè)規(guī)則的表達(dá)更為自然。Drools是用Java寫的,但能同時(shí)運(yùn)行在Java和.Net上。
一路到底的框架:
大多數(shù)開(kāi)發(fā)者都有自己喜愛(ài)的框架。無(wú)特定順序,它們包括表現(xiàn)層框架(Struts, JSF, Cocoon和Spring),持久化框架(JDO, Hibernate, Cayenne and Entity Beans)以及結(jié)構(gòu)框架(EJB, 又是Spring, Pico和Excalibur), 還有其它很多。每種框架都各有所長(zhǎng),給開(kāi)發(fā)者提供子許多“即開(kāi)即用”的功能。使用框架來(lái)部署應(yīng)用意味著你避免了許多讓人厭煩的細(xì)節(jié),讓你集中注意力到關(guān)鍵之處。
到目前為直,在框架所能做的事中仍然有一個(gè)缺口,那就是商業(yè)邏輯沒(méi)有框架。像EJB和Spring這樣的工具雖好,但它們卻幾乎沒(méi)有提及怎么組織你的那些if …then語(yǔ)句。把Drools加到你的開(kāi)發(fā)工具箱中意味著現(xiàn)在你可以“一路到底”的使用框架來(lái)構(gòu)建你的應(yīng)用程序。
2.Drools4.0版本:
JBoss Drools是一款開(kāi)源的業(yè)務(wù)規(guī)則引擎,目前已經(jīng)發(fā)布了4.0版本。在4.0版本中主要的特色和改進(jìn)如下:
1.更高的性能:較之于之前的版本,Drools 4.0更為高效并且占用更少的內(nèi)存空間。內(nèi)部的性能測(cè)試表明,性能的提升已經(jīng)從幾分鐘縮減為若干秒鐘。
2.提升的表達(dá)能力:當(dāng)前的發(fā)布版引入了更為強(qiáng)大且的業(yè)務(wù)行為腳本語(yǔ)言(MVFlex表達(dá)式語(yǔ)言)。
3.友好的業(yè)務(wù)分析工具:一個(gè)具備向?qū)Чδ艿囊?guī)則編輯器的增加,使得非程序員用戶可以設(shè)計(jì)復(fù)雜的業(yè)務(wù)規(guī)則,并在沒(méi)有編寫任何代碼的情況下自動(dòng)綁定企業(yè)數(shù)據(jù)。提供帶有菜單提示和下拉列表的向?qū)?lái)幫助用戶完成設(shè)計(jì)過(guò)程。
4.規(guī)則流的能力:可視化的建模技術(shù)可以使用戶聲明式地為相應(yīng)規(guī)則的執(zhí)行路徑建立訪問(wèn)模型。它同樣還允許在單個(gè)工作內(nèi)存中存在多個(gè)并發(fā)工作流,并根據(jù)控制典型的業(yè)務(wù)處理過(guò)程的需求,從根本上組織規(guī)則的執(zhí)行。 5.多應(yīng)用支撐:對(duì)于有狀態(tài)和無(wú)狀態(tài)處理過(guò)程增強(qiáng)的支持以及全面的線程安全性,輔助Drools更輕易的嵌入在Java平臺(tái),JavaEE以及面向服務(wù)的商業(yè)應(yīng)用之中。
6.直接可和Hibernate集成:用戶可以直接在Hibernate驅(qū)動(dòng)的RDBMS查詢中對(duì)數(shù)據(jù)(facts)進(jìn)行判斷。現(xiàn)有的Hibernate組件可以直接用在規(guī)則引擎里,減少編碼的工作量。
7.為非程序員設(shè)計(jì)的BRMS:從技術(shù)角度來(lái)看,新的BRMS基于Web開(kāi)發(fā),使用AJAX呈現(xiàn),便于協(xié)作,是一個(gè)編寫、版本化控制和管理規(guī)則的系統(tǒng)。業(yè)務(wù)分析師目前可以交互式的授權(quán)或修改自動(dòng)轉(zhuǎn)換的規(guī)則。管理員目前具備完全的生命周期控制能力,包含何種規(guī)則在QA階段,分段(staging),以及實(shí)施(production)階段等等。
3.Drools的總體架構(gòu):
我們使用Drools就是為了讓它處理數(shù)據(jù)與規(guī)則的關(guān)系,因此Drools要獲得數(shù)據(jù)和獲得規(guī)則,然后進(jìn)行執(zhí)行。因此Drools分為編制和運(yùn)行時(shí)兩個(gè)部分。
編制是指產(chǎn)生rule的過(guò)程,Drools用DRL,或者XML來(lái)描述規(guī)則。編制的過(guò)程包括為規(guī)則建立DRL 或XML 文件,傳入一個(gè)由Antlr 3 文法器定義的解析器中。解析器對(duì)文件中規(guī)則文法的正確性進(jìn)行檢查并為descr 建立一個(gè)中間結(jié)構(gòu),在AST 中的descr 代表規(guī)則的描述。AST 然后將descr 傳入Package Builder中,由其進(jìn)行打包。Package Builder 同時(shí)負(fù)責(zé)包括打包中用到的所有代碼產(chǎn)生器和編譯器。Package 對(duì)象是自包含并可配置的,它是一個(gè)包含規(guī)則的序列化的對(duì)象。
RuleBase 是運(yùn)行時(shí)組件,包含一個(gè)或多個(gè)Package。Package 在任何時(shí)候都可以向RuleBase中添加或刪除。一個(gè)RuleBase 可以同時(shí)初始化多個(gè)Working Memory,在其間維護(hù)著一個(gè)弱引用,除非重新進(jìn)行配置。Working Memory 包含許多子組件,如Working Memory Event Support(事件支持),Truth Maintenance System(真值維護(hù)系統(tǒng)), Agenda 和 Agenda Event Support(事件支持)。向Working Memory 中設(shè)置對(duì)象的工作可能要在建立了一個(gè)或多個(gè)激活的規(guī)則后才結(jié)束。Agenda 負(fù)有規(guī)劃激活規(guī)則運(yùn)行的責(zé)任。
4.Drools主要有以下類實(shí)現(xiàn):
編制:
XmlParser,DrlParser 分別用來(lái)解析XML描述的規(guī)則文件和DRL描述的規(guī)則文件。
PackageBuilder 創(chuàng)建package實(shí)例。
例如:
PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "package1.drl" ) ) );
builder.addPackageFromXml( new
InputStreamReader( getClass().getResourceAsStream( "package2.xml" ) ) );
Package pkg = builder.getPackage();
運(yùn)行時(shí)的類:
RuleBase 使用RuleBaseFactory 實(shí)例化,默認(rèn)情況下返回一個(gè)ReteOO 的RuleBase。Package通過(guò)使用addPackage 方法按順序加入。你可以指定任何名稱空間的Packages 或者同一名稱的多個(gè)包加入RuleBase。
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
事實(shí)數(shù)據(jù)相關(guān)類:
WorkingMemory 保存運(yùn)行時(shí)事實(shí)數(shù)據(jù)的地方。
由ruleBase產(chǎn)生:WorkingMemory wm= ruleBase.newStatefulSession();
加載事實(shí)數(shù)據(jù):
wm.insert(object );
insert方法返回一個(gè)FactHandle對(duì)象指向workingMemory中對(duì)象的引用。如果要對(duì)Object進(jìn)行修改刪除等操作都要通過(guò)FactHander對(duì)象來(lái)完成。
在準(zhǔn)備好Rule,和Fact后 就可以調(diào)用 WorkingMemory對(duì)象的 fireAllRules()方法執(zhí)行規(guī)則引擎。
Agenda上面提到過(guò)它負(fù)有規(guī)劃激活規(guī)則運(yùn)行的責(zé)任。
它運(yùn)行過(guò)程分兩個(gè)階段:
1) WorkingMemory Actions : assert 新的 facts ,修改存在的 facts 和 retract facts 都是 WorkingMemory Actions 。通過(guò)在應(yīng)用程序中調(diào)用 fireAllRules() 方法,會(huì)使引擎 轉(zhuǎn)換到 Agenda Evaluatioin 階段。
2) Agenda Evaluation :嘗試選擇一條規(guī)則進(jìn)行激發(fā)( fire )。如果規(guī)則沒(méi)有找到就 退出,否則它就嘗試激發(fā)這條規(guī)則,然后轉(zhuǎn)換到 WorkingMemory Actions 階段,直到 Agenda中為空。