本文對Java規則引擎與其API(JSR-94)及相關(guān)實(shí)現做了較詳細的介紹,對其體系結構和API應用有較詳盡的描述,并指出Java規則引擎,規則語(yǔ)言,JSR-94的相互關(guān)系,以及JSR-94的不足之處和展望
復雜企業(yè)級項目的開(kāi)發(fā)以及其中隨外部條件不斷變化的業(yè)務(wù)規則(business logic),迫切需要分離商業(yè)決策者的商業(yè)決策邏輯和應用開(kāi)發(fā)者的技術(shù)決策,并把這些商業(yè)決策放在中心數據庫或其他統一的地方,讓它們能在運行時(shí)(即商務(wù)時(shí)間)可以動(dòng)態(tài)地管理和修改從而提供軟件系統的柔性和適應性。規則引擎正是應用于上述動(dòng)態(tài)環(huán)境中的一種解決方法。
本文第一部分簡(jiǎn)要介紹了規則引擎的產(chǎn)生背景和基于規則的專(zhuān)家系統,第二部分介紹了什么是規則引擎及其架構和算法,第三部分介紹了商業(yè)產(chǎn)品和開(kāi)源項目實(shí)現等各種Java規則引擎,第四部分對Java規則引擎API(JSR-94)作了詳細介紹,講解了其體系結構,管理API和運行時(shí)API及相關(guān)安全問(wèn)題,第五部分則對規則語(yǔ)言及其標準化作了探討,第六部分給出了一個(gè)使用Java規則引擎API的簡(jiǎn)單示例,第七部分給予小結和展望。
1、 介紹
1.1 規則引擎產(chǎn)生背景
企業(yè)管理者對企業(yè)級IT系統的開(kāi)發(fā)有著(zhù)如下的要求:(1)為提高效率,管理流程必須自動(dòng)化,即使現代商業(yè)規則異常復雜(2)市場(chǎng)要求業(yè)務(wù)規則經(jīng)常變化,IT系統必須依據業(yè)務(wù)規則的變化快速、低成本的更新(3)為了快速、低成本的更新,業(yè)務(wù)人員應能直接管理IT系統中的規則,不需要程序開(kāi)發(fā)人員參與。
而項目開(kāi)發(fā)人員則碰到了以下問(wèn)題:
(1)程序=算法+數據結構,有些復雜的商業(yè)規則很難推導出算法和抽象出數據模型
(2)軟件工程要求從需求->設計->編碼,然而業(yè)務(wù)規則常常在需求階段可能還沒(méi)有明確,在設計和編碼后還在變化,業(yè)務(wù)規則往往嵌在系統各處代碼中
(3)對程序員來(lái)說(shuō),系統已經(jīng)維護、更新困難,更不可能讓業(yè)務(wù)人員來(lái)管理。
基于規則的專(zhuān)家系統的出現給開(kāi)發(fā)人員以解決問(wèn)題的契機。規則引擎由基于規則的專(zhuān)家系統中的推理引擎發(fā)展而來(lái)。下面簡(jiǎn)要介紹一下基于規則的專(zhuān)家系統。
1.2 基于規則的專(zhuān)家系統(RBES)
專(zhuān)家系統是人工智能的一個(gè)分支,它模仿人類(lèi)的推理方式,使用試探性的方法進(jìn)行推理,并使用人類(lèi)能理解的術(shù)語(yǔ)解釋和證明它的推理結論。專(zhuān)家系統有很多分類(lèi):神經(jīng)網(wǎng)絡(luò )、基于案例推理和基于規則系統等。
RBES包括三部分:Rule Base(knowledge base)、Working Memory(fact base)和Inference Engine(推理引擎)。它們的結構如下所示:
圖1.基于規則的專(zhuān)家系統組成

如上圖所示,推理引擎包括三部分:Pattern Matcher、Agenda和Execution Engine。Pattern Matcher何時(shí)執行哪個(gè)規則;Agenda管理PatternMatcher挑選出來(lái)的規則的執行次序;Execution Engine負責執行規則和其他動(dòng)作。
推理引擎通過(guò)決定哪些規則滿(mǎn)足事實(shí)或目標,并授予規則優(yōu)先級,滿(mǎn)足事實(shí)或目標的規則被加入議程。存在兩者推理方式:演繹法(Forward-Chaining正向鏈)和歸納法(Backward-Chaining反向鏈)。演繹法從一個(gè)初始的事實(shí)出發(fā),不斷地應用規則得出結論(或執行指定的動(dòng)作)。而歸納法則是從假設出發(fā),不斷地尋找符合假設的事實(shí)。
2、 規則引擎
2.1 業(yè)務(wù)規則
一個(gè)業(yè)務(wù)規則包含一組條件和在此條件下執行的操作,它們表示業(yè)務(wù)規則應用程序的一段業(yè)務(wù)邏輯。業(yè)務(wù)規則通常應該由業(yè)務(wù)分析人員和策略管理者開(kāi)發(fā)和修改,但有些復雜的業(yè)務(wù)規則也可以由技術(shù)人員使用面向對象的技術(shù)語(yǔ)言或腳本來(lái)定制。業(yè)務(wù)規則的理論基礎是:設置一個(gè)或多個(gè)條件,當滿(mǎn)足這些條件時(shí)會(huì )觸發(fā)一個(gè)或多個(gè)操作。
2.2 規則引擎
什么是規則引擎?規則引擎是如何執行規則的?這可以稱(chēng)之為"什么"與"如何"的問(wèn)題。到底規則引擎是什么還是目前業(yè)界一個(gè)比較有爭議的問(wèn)題,在JSR-94種也幾乎沒(méi)有定義??梢赃@樣認為充分定義和解決了"如何"的問(wèn)題,"什么"問(wèn)題本質(zhì)上也迎刃而解。也許這又是一種"先有蛋還是先有雞"哲學(xué)爭論。今后標準規則語(yǔ)言的定義和推出及相關(guān)標準的制定應該可以給這樣的問(wèn)題和爭論劃上一個(gè)句號。本文中,暫且這樣述說(shuō)什么是規則引擎:規則引擎由推理引擎發(fā)展而來(lái),是一種嵌入在應用程序中的組件,實(shí)現了將業(yè)務(wù)決策從應用程序代碼中分離出來(lái),并使用預定義的語(yǔ)義模塊編寫(xiě)業(yè)務(wù)決策。接受數據輸入,解釋業(yè)務(wù)規則,并根據規則做出業(yè)務(wù)決策。
2.3 規則引擎的使用方式
由于規則引擎是軟件組件,所以只有開(kāi)發(fā)人員才能夠通過(guò)程序接口的方式來(lái)使用和控制它,規則引擎的程序接口至少包含以下幾種API:加載和卸載規則集的API;數據操作的API;引擎執行的API。開(kāi)發(fā)人員在程序中使用規則引擎基本遵循以下5個(gè)典型的步驟:創(chuàng )建規則引擎對象;向引擎中加載規則集或更換規則集;向引擎提交需要被規則集處理的數據對象集合;命令引擎執行;導出引擎執行結果,從引擎中撤出處理過(guò)的數據。使用了規則引擎之后,許多涉及業(yè)務(wù)邏輯的程序代碼基本被這五個(gè)典型步驟所取代。
一個(gè)開(kāi)放的業(yè)務(wù)規則引擎應該可以"嵌入"在應用程序的任何位置,不同位置的規則引擎可以使用不同的規則集,用于處理不同的數據對象。此外,對使用引擎的數量沒(méi)有限制。
2.4 規則引擎架構與推理
規則引擎的架構如下圖所示:
圖2. 業(yè)務(wù)規則引擎架構

規則引擎的推理步驟如下:a. 將初始數據(fact)輸入至工作內存(Working Memory)。b. 使用Pattern Matcher將規則庫(Rules repository)中的規則(rule)和數據(fact)比較。c. 如果執行規則存在沖突(conflict),即同時(shí)激活了多個(gè)規則,將沖突的規則放入沖突集合。d. 解決沖突,將激活的規則按順序放入Agenda。e. 執行Agenda中的規則。重復步驟b至e,直到執行完畢Agenda中的所有規則。
任何一個(gè)規則引擎都需要很好地解決規則的推理機制和規則條件匹配的效率問(wèn)題。
當引擎執行時(shí),會(huì )根據規則執行隊列中的優(yōu)先順序逐條執行規則執行實(shí)例,由于規則的執行部分可能會(huì )改變工作區的數據對象,從而會(huì )使隊列中的某些規則執行實(shí)例因為條件改變而失效,必須從隊列中撤銷(xiāo),也可能會(huì )激活原來(lái)不滿(mǎn)足條件的規則,生成新的規則執行實(shí)例進(jìn)入隊列。于是就產(chǎn)生了一種"動(dòng)態(tài)"的規則執行鏈,形成規則的推理機制。這種規則的"鏈式"反應完全是由工作區中的數據驅動(dòng)的。
規則條件匹配的效率決定了引擎的性能,引擎需要迅速測試工作區中的數據對象,從加載的規則集中發(fā)現符合條件的規則,生成規則執行實(shí)例。1982年美國卡耐基·梅隆大學(xué)的Charles L. Forgy發(fā)明了一種叫Rete算法,很好地解決了這方面的問(wèn)題。目前世界頂尖的商用業(yè)務(wù)規則引擎產(chǎn)品基本上都使用Rete算法。
2.5 規則引擎的算法
大部分規則引擎產(chǎn)品的算法,基本上都來(lái)自于Dr. Charles Forgy在1979年提出的RETE算法及其變體,Rete算法是目前效率最高的一個(gè)Forward-Chaining推理算法,Drools項目是Rete算法的一個(gè)面向對象的Java實(shí)現,Rete算法其核心思想是將分離的匹配項根據內容動(dòng)態(tài)構造匹配樹(shù),以達到顯著(zhù)降低計算量的效果。詳情請見(jiàn)CIS587:The RETE Algorithm,The Rete Algorithm,RETE演算法,《專(zhuān)家系統原理與編程》中第11章等。
3、 Java規則引擎
目前主流的規則引擎組件多是基于Java和C++程序語(yǔ)言環(huán)境,已經(jīng)有多種Java規則引擎商業(yè)產(chǎn)品與開(kāi)源項目的實(shí)現,其中有的已經(jīng)支持JSR94,有的正朝這個(gè)方向做出努力,列出如下:
3.1 Java規則引擎商業(yè)產(chǎn)品
Java規則引擎商業(yè)產(chǎn)品主要有(Jess不是開(kāi)源項目,它可以免費用于學(xué)術(shù)研究,但用于商業(yè)用途則要收費):

3.2 Java規則引擎開(kāi)源項目
開(kāi)源項目的實(shí)現主要包括:
Drools - Drools規則引擎應用Rete算法的改進(jìn)形式Rete-II算法。從內部機制上講,它使用了和Forgy的算法相同的概念和方法,但是增加了可與面向對象語(yǔ)言無(wú)縫連接的節點(diǎn)類(lèi)型。
Mandarax 基于反向推理(歸納法)。能夠較容易地實(shí)現多個(gè)數據源的集成。例如,數據庫記錄能方便地集成為事實(shí)集(facts sets),reflection用來(lái)集成對象模型中的功能。目前不支持JSR 94
OFBiz Rule Engine - 支持歸納法(Backward chaining).最初代碼基于Steven John Metsker的"Building Parsers in Java",不支持JSR 94
JLisa - JLisa是用來(lái)構建業(yè)務(wù)規則的強大框架,它有著(zhù)擴展了LISP優(yōu)秀特色的優(yōu)點(diǎn),比Clips還要強大.這些特色對于多范例軟件的開(kāi)發(fā)是至關(guān)重要的.支持JSR 94
其它的開(kāi)源項目實(shí)現有諸如Algernon, TyRuBa, JTP, JEOPS, InfoSapient, RDFExpert, Jena 2, Euler, JLog, Pellet OWL Reasoner, Prova, OpenRules, SweetRules, JShop2等等。
4、 Java規則引擎API(JSR-94)
4.1 簡(jiǎn)介
過(guò)去大部分的規則引擎開(kāi)發(fā)并沒(méi)有規范化,有其自有的API,這使得其與外部程序交互集成不夠靈活。轉而使用另外一種產(chǎn)品時(shí)往往意味需要重寫(xiě)應用程序邏輯和API調用,代價(jià)較大。規則引擎工業(yè)中標準的缺乏成為令人關(guān)注的重要方面。2003年11月定稿并于2004年8月最終發(fā)布的JSR 94(Java規則引擎API)使得Java規則引擎的實(shí)現得以標準化。
Java規則引擎API由javax.rules包定義,是訪(fǎng)問(wèn)規則引擎的標準企業(yè)級API。Java規則引擎API允許客戶(hù)程序使用統一的方式和不同廠(chǎng)商的規則引擎產(chǎn)品交互,就像使用JDBC編寫(xiě)獨立于廠(chǎng)商訪(fǎng)問(wèn)不同的數據庫產(chǎn)品一樣。Java規則引擎API包括創(chuàng )建和管理規則集合的機制,在Working Memory中添加,刪除和修改對象的機制,以及初始化,重置和執行規則引擎的機制。
4.2 簡(jiǎn)介Java規則引擎API體系結構
Java規則引擎API分為兩個(gè)主要部分:運行時(shí)客戶(hù)API(the Runtime client API)和規則管理API(the rules administration API)。
聯(lián)系客服