規則引擎
規則引擎
規則引擎由推理引擎發展而來,是一種嵌入在應用程序中的組件,實現了將業務決策從應用程序代碼中分離出來,並使用預定義的語義模塊編寫業務決策。接受數據輸入,解釋業務規則,並根據業務規則做出業務決策。
企業級管理者對企業IT系統的開發有著如下的要求:
1.為提高效率,管理流程必須自動化,即使現代商業規則異常複雜。
2.市場要求業務規則經常變化,IT系統必須依據業務規則的變化快速、低成本的更新。
3.為了快速、低成本的更新,業務人員應能直接管理IT系統中的規則,不需要程序開發人員參與。
使用規則引擎可以通過降低實現複雜業務邏輯的組件的複雜性,降低應用程序的維護和可擴展性成本,其優點如下:
· 分離商業決策者的商業決策邏輯和應用開發者的技術決策;
· 能有效的提高實現複雜邏輯的代碼的可維護性;
· 在開發期間或部署后修復代碼缺陷;
· 應付特殊狀況,即客戶一開始沒有提到要將業務邏輯考慮在內;
· 符合組織對敏捷或迭代開發過程的使用;
大多數規則引擎都支持規則的次序和規則衝突檢驗,支持簡單腳本語言的規則實現,支持通用開發語言的嵌入開發。目前業內有多個規則引擎可供使用,其中包括商業和開放源碼選擇。開源的代表是Drools,商業的代表是VisualRules ,iLog。
許多組織正從面向對象的業務流程管理範例轉移到面向服務的方法;實際上,服務正在成為應用程序開發的基本元素。同時,業務流程執行語言(BPEL)已經成為編排這些服務和管理業務流程的無缺陷執行的事實標準。這些趨勢所產生的結果是,為更靈活、更經濟高效地管理業務流程提供了一些良機。
大多數業務流程(貸款審批就是一個典型示例)包含多個決策點。在這些決策點處,將對某個條件進行評估。業務流程根據這些標準或業務規則更改它們的行為。(一個是BPEL流程編排的分支可能存在規則,一個是BPEL中的活動節點本身可能存在數據處理規則。)實際上,這些業務規則對業務流程起到了推動作用。這些規則通常嵌入到業務流程本身或自定義Java代碼的內部,這將導致在將來的某個時候出現若干問題:
• 業務規則比業務本身更改得更頻繁,而更改和管理嵌入的業務規則是一個複雜問題,並超出了大多數分析員的能力範圍。因此,隨著業務規則的更改,程序員通常要消耗大量時間來執行該任務。
• 大多數組織都缺少中央規則信息庫。策略中任何涉及到組織範圍的更改都無法運用到所有業務流程中。
• 業務流程無法重用規則。因此,IT人員最終要為每個流程設計規則,這通常導致不一致性或冗餘。
避免這些問題的最佳方法是使用規則引擎將業務流程與業務規則分離。在該方法中,規則公開為服務,而BPEL流程在到達決策點時通過查詢該引擎來利用這些服務。該方法更為靈活-可以通過圖形方式操作規則,而不是在編程語言中或在流程內部對規則進行編碼。業務用戶可以使用工具自行編寫規則,並且無需IT人員的協助即可進行部署后的規則更改。由於大多數更新和功能增強是由業務用戶執行的,因此可以顯著減少維護成本。
規則引擎是解析、調用、執行規則包的服務,目前VisualRules採用java語言來實現規則引擎,並且提供了java類介面、Socket、Servlet、SOAP等多種外部調用介面。其實Java類介面是所有這些介面的核心,其他介面其實也是通過Java類介面來加以調用。考慮到最小化規則引擎,因此規則包的解析工作已經放在規則編輯時,預先進行了處理。規則引擎只處理規則包的調用和執行,同時為規則包用到的資料庫介面、Excel介面、內存表介面、Xml介面提供預設的實現。
VisualRules規則引擎會根據規則包名稱,取得對應規則包編譯后的rsc文件。然後將rsc載入到內存中,生成規則包執行上下文。同時規則引擎將傳遞的參數傳遞到規則包執行上下文中,然後開始執行規則包。執行完畢后,再將規則包執行上下文中的數據,傳回給調用規則包的應用程序。整個執行原理非常簡單,因此最大限度的保證了規則運行平台的穩定以及最佳的性能。
規則包的對象庫中,定義了以下一些資料庫對象介面Database、Table、Select、View、Procedure。VisualRules規則引擎直接用JDBC來實現這些介面,最大限度的保證了資料庫對象調用的性能。當然用戶可以根據自己的需要,重新來實現這些資料庫介面。
規則包需要調用的Excel介面主要是IExcelBook、IExcelSheet、IExcelTableSheet、IExcelXYSheet。VisualRules規則引擎採用POI來實現Excel介面。
規則包需要調用的內存表格介面為Sheet,VisualRules採用Object[][]來實現內存表格介面的實現。
規則包需要調用的XML介面為Node。目前VisualRules採用Jdom來實現。
規則引擎是外部Java程序調用規則包的一組Java類,其包含在engine.jar中。外部Java程序調用規則包時只需要用到兩個類。一個是 com.flagleader.engine.RuleEngine。另一個是 com.flagleader.engine.RuleEngineFactory。
RuleEngineFactory是得到規則引擎實例的工廠類。通常代碼為
RuleEngine ruleEngine = RuleEngineFactory.newInstance().getRuleEngine();
得到規則引擎實例后,可以調用規則引擎中的方法,主要是put、excute和get這三個方法。 put用於傳入需要傳入的值,excute用於運行指定的規則包,get用於得到傳出的值。一般的調用代碼為:
ruleEngine.put(傳入對象);
ruleEngine.excute("規則包調用名");
傳出對象 = ruleEngine.get("傳出對象名");
因此外部程序調用規則包非常簡單。只需以上幾行代碼就可以完成應用。