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