詳解Java規則引擎與其API – JAVA編程語言程序開發技術文章

 本文對Java規則引擎與其API(JSR-94)及相關實現做瞭較詳細的介紹,對其體系結構和API應用有較詳盡的描述,並指出Java規則引擎,規則語言,JSR-94的相互關系,以及JSR-94的不足之處和展望

  復雜企業級項目的開發以及其中隨外部條件不斷變化的業務規則(business logic),迫切需要分離商業決策者的商業決策邏輯和應用開發者的技術決策,並把這些商業決策放在中心數據庫或其他統一的地方,讓它們能在運行時(即商務時間)可以動態地管理和修改從而提供軟件系統的柔性和適應性。規則引擎正是應用於上述動態環境中的一種解決方法。

  本文第一部分簡要介紹瞭規則引擎的產生背景和基於規則的專傢系統,第二部分介紹瞭什麼是規則引擎及其架構和算法,第三部分介紹瞭商業產品和開源項目實現等各種Java規則引擎,第四部分對Java規則引擎API(JSR-94)作瞭詳細介紹,講解瞭其體系結構,管理API和運行時API及相關安全問題,第五部分則對規則語言及其標準化作瞭探討,第六部分給出瞭一個使用Java規則引擎API的簡單示例,第七部分給予小結和展望。

  1、 介紹

  1.1 規則引擎產生背景

  企業管理者對企業級IT系統的開發有著如下的要求:(1)為提高效率,管理流程必須自動化,即使現代商業規則異常復雜(2)市場要求業務規則經常變化,IT系統必須依據業務規則的變化快速、低成本的更新(3)為瞭快速、低成本的更新,業務人員應能直接管理IT系統中的規則,不需要程序開發人員參與。

  而項目開發人員則碰到瞭以下問題:(1)程序=算法+數據結構,有些復雜的商業規則很難推導出算法和抽象出數據模型(2)軟件工程要求從需求->設計->編碼,然而業務規則常常在需求階段可能還沒有明確,在設計和編碼後還在變化,業務規則往往嵌在系統各處代碼中(3)對程序員來說,系統已經維護、更新困難,更不可能讓業務人員來管理。

  基於規則的專傢系統的出現給開發人員以解決問題的契機。規則引擎由基於規則的專傢系統中的推理引擎發展而來。下面簡要介紹一下基於規則的專傢系統。

  1.2 基於規則的專傢系統(RBES)

  專傢系統是人工智能的一個分支,它模仿人類的推理方式,使用試探性的方法進行推理,並使用人類能理解的術語解釋和證明它的推理結論。專傢系統有很多分類:神經網絡、基於案例推理和基於規則系統等。

  RBES包括三部分:Rule Base(knowledge base)、Working Memory(fact base)和Inference Engine(推理引擎)。它們的結構如下所示:

圖1.基於規則的專傢系統組成
圖1.基於規則的專傢系統組成

  如上圖所示,推理引擎包括三部分:Pattern Matcher、Agenda和Execution Engine。Pattern Matcher何時執行哪個規則;Agenda管理PatternMatcher挑選出來的規則的執行次序;Execution Engine負責執行規則和其他動作。

  推理引擎通過決定哪些規則滿足事實或目標,並授予規則優先級,滿足事實或目標的規則被加入議程。存在兩者推理方式:演繹法(Forward-Chaining正向鏈)和歸納法(Backward-Chaining反向鏈)。演繹法從一個初始的事實出發,不斷地應用規則得出結論(或執行指定的動作)。而歸納法則是從假設出發,不斷地尋找符合假設的事實。

  2、 規則引擎

  2.1 業務規則
 
  一個業務規則包含一組條件和在此條件下執行的操作,它們表示業務規則應用程序的一段業務邏輯。業務規則通常應該由業務分析人員和策略管理者開發和修改,但有些復雜的業務規則也可以由技術人員使用面向對象的技術語言或腳本來定制。業務規則的理論基礎是:設置一個或多個條件,當滿足這些條件時會觸發一個或多個操作。

  2.2 規則引擎

  什麼是規則引擎?規則引擎是如何執行規則的?這可以稱之為”什麼”與”如何”的問題。到底規則引擎是什麼還是目前業界一個比較有爭議的問題,在JSR-94種也幾乎沒有定義。可以這樣認為充分定義和解決瞭”如何”的問題,”什麼”問題本質上也迎刃而解。也許這又是一種”先有蛋還是先有雞”哲學爭論。今後標準規則語言的定義和推出及相關標準的制定應該可以給這樣的問題和爭論劃上一個句號。本文中,暫且這樣述說什麼是規則引擎:規則引擎由推理引擎發展而來,是一種嵌入在應用程序中的組件,實現瞭將業務決策從應用程序代碼中分離出來,並使用預定義的語義模塊編寫業務決策。接受數據輸入,解釋業務規則,並根據規則做出業務決策。

  2.3 規則引擎的使用方式

  由於規則引擎是軟件組件,所以隻有開發人員才能夠通過程序接口的方式來使用和控制它,規則引擎的程序接口至少包含以下幾種API:加載和卸載規則集的API;數據操作的API;引擎執行的API。開發人員在程序中使用規則引擎基本遵循以下5個典型的步驟:創建規則引擎對象;向引擎中加載規則集或更換規則集;向引擎提交需要被規則集處理的數據對象集合;命令引擎執行;導出引擎執行結果,從引擎中撤出處理過的數據。使用瞭規則引擎之後,許多涉及業務邏輯的程序代碼基本被這五個典型步驟所取代。

  一個開放的業務規則引擎應該可以”嵌入”在應用程序的任何位置,不同位置的規則引擎可以使用不同的規則集,用於處理不同的數據對象。此外,對使用引擎的數量沒有限制。

  2.4 規則引擎架構與推理

  規則引擎的架構如下圖所示:

圖2. 業務規則引擎架構
圖2. 業務規則引擎架構

  規則引擎的推理步驟如下:a. 將初始數據(fact)輸入至工作內存(Working Memory)。b. 使用Pattern Matcher將規則庫(Rules repository)中的規則(rule)和數據(fact)比較。c. 如果執行規則存在沖突(conflict),即同時激活瞭多個規則,將沖突的規則放入沖突集合。d. 解決沖突,將激活的規則按順序放入Agenda。e. 執行Agenda中的規則。重復步驟b至e,直到執行完畢Agenda中的所有規則。

  任何一個規則引擎都需要很好地解決規則的推理機制和規則條件匹配的效率問題。

  當引擎執行時,會根據規則執行隊列中的優先順序逐條執行規則執行實例,由於規則的執行部分可能會改變工作區的數據對象,從而會使隊列中的某些規則執行實例因為條件改變而失效,必須從隊列中撤銷,也可能會激活原來不滿足條件的規則,生成新的規則執行實例進入隊列。於是就產生瞭一種”動態”的規則執行鏈,形成規則的推理機制。這種規則的”鏈式”反應完全是由工作區中的數據驅動的。

  規則條件匹配的效率決定瞭引擎的性能,引擎需要迅速測試工作區中的數據對象,從加載的規則集中發現符合條件的規則,生成規則執行實例。1982年美國卡耐基·梅隆大學的Charles L. Forgy發明瞭一種叫Rete算法,很好地解決瞭這方面的問題。目前世界頂尖的商用業務規則引擎產品基本上都使用Rete算法。

  2.5 規則引擎的算法
 
  大部分規則引擎產品的算法,基本上都來自於Dr. Charles Forgy在1979年提出的RETE算法及其變體,Rete算法是目前效率最高的一個Forward-Chaining推理算法,Drools項目是Rete算法的一個面向對象的Java實現,Rete算法其核心思想是將分離的匹配項根據內容動態構造匹配樹,以達到顯著降低計算量的效果。詳情請見CIS587:The RETE Algorithm,The Rete Algorithm,RETE演算法,《專傢系統原理與編程》中第11章等。

  3、 Java規則引擎
 
  目前主流的規則引擎組件多是基於Java和C++程序語言環境,已經有多種Java規則引擎商業產品與開源項目的實現,其中有的已經支持JSR94,有的正朝這個方向做出努力,列出如下:

  3.1 Java規則引擎商業產品

  Java規則引擎商業產品主要有(Jess不是開源項目,它可以免費用於學術研究,但用於商業用途則要收費):


  3.2 Java規則引擎開源項目

  開源項目的實現主要包括:

  Drools – Drools規則引擎應用Rete算法的改進形式Rete-II算法。從內部機制上講,它使用瞭和Forgy的算法相同的概念和方法,但是增加瞭可與面向對象語言無縫連接的節點類型。

  Mandarax 基於反向推理(歸納法)。能夠較容易地實現多個數據源的集成。例如,數據庫記錄能方便地集成為事實集(facts sets),reflection用來集成對象模型中的功能。目前不支持JSR 94

  OFBiz Rule Engine – 支持歸納法(Backward chaining).最初代碼基於Steven John Metsker的”Building Parsers in Java”,不支持JSR 94

發佈留言