業務規則管理系統(BRMS)在電信,銀行和政府等各行業中普遍使用,用來支持業務規則的編輯,管 理和部署,以適應業務的快速變化。Drools 是一款基於 Java 的開源產品,包括業務規則執行引擎和業務規則管理系統。本文首先介紹了業務規則引擎和業務規則管理系統的基本概念和體系結構,而後介紹一個智能交通系統中 的典型業務場景,最後展示如何經過使用 Drools BRMS 來實現這個業務場景,並根據不一樣的業務須要靈活配置這些業務規則。 html
回頁首 java
智 能交通系統中的道路收費系統的基本業務場景是:載有特定裝置(一般是電子標籤裝置或者是有全球衛星定位功能的裝置)的車輛進入收費區後,收費區的信號探測 器發出掃描信號,檢測並獲取該車的有關信息,譬如信號探測系統可以獲取並記錄諸如車輛的幾何尺寸、車重、車型等數據。對於沒有安裝這種裝置的車輛來講,系 統能夠經過攝像機拍攝記錄得到車型、車牌號等信息。而後根據不一樣的收費業務規則,針對不一樣的車輛採起不一樣的收費標準。 web
目前主要的道路收費業務規則有基於特殊道路使用收費、基於區域收費和基於距離 / 時間收費等。 數據庫
前 面提到的智能交通系統中的業務規則,是業務場景中真實存在的,爲了實現這些業務規則,咱們能夠經過在程序代碼裏,用各類編程語言和其餘業務邏輯一樣的實 現。可是因爲業務規則的易變性,很容易致使程序代碼的重寫,無疑會增長維護的成本和沒法快速反應需求的變化。業務規則引擎提供了對業務規則解析執行。下降 實現業務邏輯的複雜性,提升了應用程序的可維護性和可擴展性。 編程
業 務規則管理系統是在業務規則引擎基礎上的擴展,提供了一套包含業務規則整個生命週期的管理系統。減輕了業務規則維護的工做量。下降了複雜性,方便用戶而不 是技術專家來管理業務規則。提供了業務規則動態修改的能力,即業務人員經過在系統中改變業務規則文件,應用程序無需從新裝載,就能及時反應規則的變化。 緩存
Drools BRMS 是一個 Web 應用程序,能夠部署在大部分的支持 J2SE 1.5 的 Web 容器下,如 Tomcat 5.5。Drools BRMS 是從 Drools 的 4.0 版本以後加入的,咱們使用的版本是 4.0.7。 服務器
Drools BRMS 架構體系分爲三大部分,第一部分是 UI 層,提供了一個基於 Ajax 技術的業務規則編輯、管理工具。利用 Google Widget Toolkit(GWT)實現 Ajax 技術,提供了較好的用戶體驗。第二部分是規則文件倉庫層,將規則文件統一保持在文件系統或關係數據庫。基於開源 Apache 工具的 JackRabbit 實現。JackRabbit 是一種支持結構化和非結構化數據的內容存儲,是 Java 內容倉庫規範 JCR 的一個實現。最後一個是 Drools 的核心引擎,用來對用戶提交的規則文件進行驗證、編譯和部署。 session
開發人員經過規則文件的編輯部署,生 成了包含 rule 的 package 對象,這是引擎可直接操做的內存對象。BRMS 經過一個 URL 提供對這個對象的 HTTP 訪問。第三方能夠經過 RuleAgent 的 API 來訪問這個 URL,程序自動下載這個 Package 對象就直接能夠在規則引擎運行,獲得規則執行的結果。整個結構以下圖所示 架構
回頁首 編程語言
這裏以一個高速公路收費的場景爲例,抽取其中詳細的計費業務規則。此業務規則是前面介紹過的基於特殊道路使用的收費模式的一種應用,當車輛經過一次收費檢測點就收取一次費用,產生一條收費帳單。對於不一樣的車輛,經過不一樣的道路,將會被收取不一樣的費用。
不一樣的道路類型、收費檢測點類型、車輛類型、帳戶類型、車輛使用類別和不一樣的通行時間會產生不一樣的費用。這些信息都將做爲計費業務規則的輸入。
如 果車輛安裝合法的電子標籤設備,當車輛經過收費站時,系統將經過讀取電子標籤的內容識別車輛信息。若是車輛未安裝合法的電子標籤設備,系統會啓動攝像頭拍 攝車輛經過時的圖片,自動識別圖片中的車牌信息。若是系統沒法自動識別,將經過人工識別得到車輛信息。不管是經過電子標籤識別,自動車牌識別,仍是人工識 別,當得到車輛自己信息以及車輛綁定的帳戶信息以後,能夠根據相應的業務規則計算出道路使用費用。
一個簡單的道路使用計費規則以下表所示:
道路運營商代碼 | 收費檢測點代碼 | 車輛綁定帳戶類別 | 車輛類型 | 日期 | 時間 | 車輛用途類別 | 道路基本使用費 | |
---|---|---|---|---|---|---|---|---|
1 | 201 | 001 | ANNUAL | 1 | 2,7 | 8,24 | A | 5.1 |
2 | 201 | 001 | ANNUAL | 1 | 2,7 | 0,8 | A | 4.9 |
3 | 201 | 001 | ANNUAL | 1 | 1,1 | 8,24 | A | 5 |
4 | 201 | 001 | ANNUAL | 1 | 1,1 | 0,8 | A | 3.3 |
5 | 201 | 001 | ANNUAL | 2 | 2,7 | 8,24 | B | 6.5 |
6 | 201 | 001 | ANNUAL | 2 | 2,7 | 0,8 | B | 5.3 |
7 | 201 | 001 | ANNUAL | 2 | 1,1 | 8,24 | B | 5.4 |
8 | 201 | 001 | ANNUAL | 2 | 1,1 | 0,8 | B | 3.7 |
9 | 201 | 001 | TEMP | 3 | 2,7 | 8,24 | C | 5.2 |
10 | 201 | 001 | TEMP | 3 | 2,7 | 0,8 | C | 3.4 |
在 3.3.1 中,咱們提到,系統可能會經過不一樣的方法識別車輛:電子標籤識別(TAG),自動識別車牌(OCR)或人工識別車牌 (MIR),不一樣的識別方法可能產生不一樣的附加費用。電子標籤識別快速、簡單,這裏附加費用爲 0。自動車牌識別將啓用光學圖片識別引擎來識別車牌,產生必定的附加費(0.5 元)。而人工識別則是在自動車牌識別失敗後,經過人眼辨別圖像識別車輛,須要耗費更多的系統資源和人力,產生了較高的附加費用(1 元)。附加費用的收取能夠鼓勵車主使用電子標籤,使得收費更快捷簡單。
序號 | 車輛識別方法 | 附加費 |
---|---|---|
1 | TAG | 0 |
2 | OCR | 0.5 |
3 | MIR | 1 |
用戶在爲車輛註冊綁定帳戶時,能夠選擇不一樣的帳戶類型,如臨時帳戶 (TEMP)、年結算帳戶(ANNUAL),不一樣的帳戶類型能夠給予不一樣的優惠。
序號 | 車輛綁定帳戶類別 | 折扣 |
---|---|---|
1 | ANNUAL | -0.2 |
2 | TEMP | -0.4 |
基 於上面的介紹,咱們瞭解了一個典型的業務場景。下面咱們介紹如何用 Drools 實現這個業務場景。咱們首先要創建一個完整的規則庫,包括在 Drools BRMS 上創建工做目錄,業務對象建模以及基於決策表的規則文件編寫。其次咱們編輯了一個簡單的用戶界面來調用規則引擎。最後咱們介紹對規則進行的修改可以在咱們 的用戶界面上及時展示。
工做目錄是存放業務規則文件,業務對象以及其餘一些規則相關對象的地方。將 Drools BRMS 安裝到 Tomcat 並啓動後,打開 URL:http://localhost:8080/drools-jbrms/org.drools.brms.JBRMS/JBRMS.html,點擊 Login 進入系統,咱們就能夠看到系統的主界面。
Drools BRMS 以包的方式管理全部相關的規則文件,函數和業務對象模型等。咱們點擊「create new package」的圖標,建立一個名爲 com.sample.rule 的工做目錄。之後咱們將在這個包下建立規則和業務對象模型。
BOM(Business Object Model) 是業務規則引擎所要操做的對象。在 Drools 中業務對象就是普通的 Java 對象。咱們創建一個叫作 RuleInput 的對象如圖 3 所示,這是一個保存輸入輸出參數的對象。包含 identifyMethod,detectionTime,detectionPointCode,accountType,vehicleClass,dayOfWeek,timeOfDay,operator,purposeOfUse, 這些都是做爲判斷條件的參數,而 TollFee,AdminFee 和 Discount 對應三種計算所得的子項,存放通行費,附加費和折扣值。
在 com.sample.rule 包下建立一個叫作 RuleModel 的模型歸檔文件。將前面的 Java 文件導出成 Jar 包,點擊上傳圖標上傳到 Drools BRMS 中。
在 包的配置中添加類路徑,以便系統裝載這個 RuleInput 類。點擊工做目錄 com.sample.rule,選擇 Edit Page Configuration,如圖 5 在 Header 編輯框裏,添加「import com.sample.rule.RuleInput」, 點擊 save and validate configuration 按鈕來保存配置。這樣就完成了一個業務對象模型。
這 一步咱們就要進入關鍵的一步了——建立和編輯規則文件。Drools 支持多種業務規則的定義方式,如基於業務規則語言 drl(Drools Rule Language)的方式,基於天然語言的方式和基於決策表的方式等。決策表是一種簡單可是精確的表示規則的方式,容易使業務人員理解和使用。因此咱們採 用基於決策表來定義咱們的業務規則。決策表能夠用 MS office 或 OpenOffice 編輯。其中的一行就是一條規則,分爲條件和動做兩部分,若是知足條件則執行相應的動做。
決策表包括如下幾部分:
一個文件對應一個規則集合,能夠包含多個規則表。第二行關鍵字 RuleSet,其值和工做目錄名一致。Import 關鍵字定義規則引擎裝載業務對象的類路徑。Notes 關鍵字是用來註釋這個規則集合的用途。
每 個規則表,分爲表格頭和表格體兩部分。表頭定義表格的模板信息。第六行 RuleTable 關鍵字表示一個規則表從這裏開始。第七行說明所在列是條件仍是動做。第八行表示規則所要操做的對象模型,咱們聲明瞭一個 fee 變量,它的類型是前面定義的 RuleInput 類。在動做那一列咱們就可使用 fee 這個變量了。第九行就是條件模板或者動做模板,定義了輸入業務模型實例的屬性知足條件模板就執行動做模板,例如輸入的 RuleInput 實例若是 operator==201,則知足了表格體的第一行第一列條件。一樣,若是車輛被探測到的時間在 8 點到 24 點之間,那麼知足了表格體的第一行第六列條件。其中 $1 表示第一個參數,$2 表示第二個參數,當只有一個參數時,就用 $param 來表示。第十行是對各個屬性的描述。
一樣,咱們定義了兩個決策表來計算附加費和折扣
經過上面的描述,咱們定義了一個完整的規則文件。而後咱們就能夠上傳到 Drools BRMS 上了。打開剛纔的 URL,首先要建立一個類別,選擇左邊的 Admin 菜單,選擇 Manage Category 頁,建立一個 SampleCtg 類別。
而後點擊「create new rule」圖標,建立一個 Business Rule Asset,命名爲 SampleRule。類別選擇剛纔的 SampleCtg,選擇規則類型爲決策表類型。而後上傳決策表文件。
上傳以後,點擊 Validate 按鈕來驗證上傳的規則文件是否正確。若是有錯誤就根據提示進行改正,再次上傳驗證直到驗證經過。
最 後一步就是發佈這個業務規則,發佈時 Drools BRMS 提供了一個 http 地址,這樣客戶端能夠經過這個地址訪問到這個業務規則。點擊包 com.sample.rule,選擇右邊的 Build, Validate and deploy 欄目,點擊 Build Package,而後點擊 Create snapshot for deploy 鍵,命名爲 TollRule,點擊建立,這樣就完成了發佈。在 Deployment 菜單咱們能夠看到發佈的規則文件地址爲http://localhost:8080/drools-jbrms/org.drools.brms.JBRMS/package/com.sample.rule/TollRule。
我 們開發了一個簡單的 JSP web 客戶端來模擬實際的業務系統,須要調用 Drools BRMS 來顯示規則執行的結果。Drools 的核心包中提供了一個 RuleAgent 的 API,可以動態地訪問在 BRMS 上發佈的業務規則文件。RuleAgent 可以將規則文件下載到本地並裝載到規則引擎進行解析執行。RuleAgent 須要一些參數進行初始化對象,這些參數保存在一個配置文件中,用單例模式裝載配置文件生成一個惟一的 RuleAgent 對象。從 RuleAgent 獲得一個 StatefulSession,就能夠執行規則了。在 session 對象中注入前面定義的一個 RuleInput 對象。fireAllRules() 就執行了全部的規則。獲得的結果保存在 RuleInput 的輸出屬性中。
public class ChargeSessionHelper { private static RuleAgent agent; private static StatefulSession session; public static StatefulSession getSession(){ if(agent==null){ agent=loadRuleAgent(); } //get ruleBase intance RuleBase ruleBase=agent.getRuleBase(); //create StatefulSession session=ruleBase.newStatefulSession(); return session; } private static RuleAgent loadRuleAgent() { //initialize the parameters from the property file,get a RuleAgent instance return RuleAgent.newRuleAgent("/rules.properties"); } } public RuleInput excute(){ //create StatefulSession StatefulSession session=ChargeSessionHelper.getSession(); //insert an instance of RuleInput session.insert(input); //fire all the rules session.fireAllRules(); //destroy the StatefulSession session.dispose(); //return the result, stored in the input object return input; }
Rules.properties 文件包含基本的配置信息。newInstance 若是設爲 false,那麼 RuleAgent 不須要每次都建立一個 RuleBase,當服務器規則文件更新時,StatefulSession 可以自動更新。url 是設置成服務器上已部署的規則文件地址。poll=30 表示 RuleAgent 每隔 30 秒都會輪詢一次 url 規則是否有更新。Name 表示這個 RuleAgent 的名字,將會出如今日誌裏。localCacheDir 表示將服務器上的規則文件緩存到本地的目錄,這個屬性大大提升性能,當服務器規則發生改變時,本地的緩存文件也會自動更新。
newInstance=false url=http://localhost:8080/drools-jbrms/org.drools.brms.JBRMS/ package/com.sample.rule/TollRule poll=30 name=TollRule localCacheDir=c:/temp
下圖是咱們的一個調用界面
Drools BRMS 提供了規則動態修改的功能。當業務規則發生變化,如 OCR 附加費從 50 提升到了 80,咱們只須要將第二張決策表的 50 改爲 80,從新上傳這個文件,而且發佈這個業務規則。不須要從新啓動應用,修改後的規則可以實時地應用到業務系統中,即咱們的規則調用頁面刷新後,就能展示附 加費從 50 提升到了 80
Drools BRMS 雖然相比商業化的業務規則管理系統還有一些不足,但倒是目前較好的開源業務規則管理系統。在基於 Drools 這個強大的開源規則引擎上,提供了一個輕量級的管理系統。基於 Web 2.0 Ajax 技術,提供了較好的用戶友好度,支持規則文件的上傳,編輯,版本管理,編譯部署等整個過程。實現了業務規則的動態配置。知足在業務規則頻繁更新的行業中應 用。
本文介紹瞭如何經過業務規則管理軟件 Drools BRMS,實現智能交通系統中的業務規則。爲了展現規則的動態修改,咱們開發了一個 Web 客戶端來訪問規則。