規則引擎一:IBM規則引擎 ODM入門

轉自http://www.cnblogs.com/soul-tap/p/4956052.html

最近,因項目需要,研究使用IBM的規則引擎,但是網上相關資料甚少,只能查看IBM官網的相關文檔,但大多是英文,所以學習過程相當痛苦,好在有IBM的技術支持人員幫助,在此,決定將自己對ODM的學習過程做成一個入門系列,鞏固一下自己,同時惠及他人。

ODM簡介

ODM:Operational Decision Manager,直接翻譯的話就是“決策管理系統”,什麼是決策?決策就是業務人員決策人員制定的業務規則,而ODM就是管理這些業務規則的一套系統。舉個簡單例子來說:一個店鋪,雙十一期間打折,根據用戶的等級給出的折扣是不一樣的,如:普通用戶享受9折優惠,白金用戶享受8折優惠,鑽石用戶享受7折優惠,這就是“業務規則”,這樣的業務場景在我們身邊比比皆是,一般我們的做法是在代碼中做一系列if...else判斷,更好一些的做法是將規則條件轉換成配置文件,實現與代碼的低耦合,但是,一旦發生了規則的添加那麼代碼就一定得作出修改。當然,這緊緊是列舉了一個相當簡單的業務場景,面對那些複雜的業務場景涉及成千上萬的規則判斷時候,那在應用代碼中維護,就是一項十分恐怖的工作。ODM就是一套管理這些業務規則並且獨立於應用系統之外的一個產品,它包含了很多組件可以幫助IT或非IT之外的人員實現決策的定製、維護和監控工作,幫助決策人員作出更好的決策,大大降低複雜業務規則維護帶來的巨大工作量,它支持對外提供web服務,滿足SOA架構需求。

ODM相關組件介紹

 這裏介紹一些主要的組件:

1、Rule Designer:這是創建規則項目、打包、發佈規則的一個編輯器,本身是一個eclipse插件,會使用eclipse便可以很輕鬆掌握這款編輯器的使用。

2、Rule TeamServer:也叫決策中心,簡稱rts,在編輯器(Rule Designer)中編輯好的規則項目可以同步到rts,業務人員和it人員可以在這個環境上進行規則集的調試,規則流結構的調整,以及向規則集中編輯添加新規則,支持業務人員以導入excel的形式導入新規則等等。

3、Rule Execution Server:規則執行環境,簡稱res,有人說他是規則引擎的核心,在編輯器中編輯好的規則,打包部署到res環境上,規則集便可以進行執行,該服務支持將規則發佈成webservice,以供客戶端調用,res同時支持規則的完成性檢查,可以對規則調用的次數及效率進行監控,支持生成excel文件類型的規則執行報告。

使用Rule Designer創建規則項目

上面介紹了ODM的主要組件,接下來,開始我們本篇博客的主要內容部分:使用Rule Designer編輯器創建規則項目,至於rts及res,會在本系列之後的博文中再做詳細講解。

業務場景

設置一個簡單的業務場景:

人員信息檢查:

1、人員的年齡<18歲,不檢查人員性別,設置人員信息爲“未成年人”;

2、人員的年齡>=18歲,檢查人員性別,設置人員信息爲“成年女/男性”;

從業務場景中我們簡單提煉出一個人員的java bean對象:

1
2
3
4
5
6
7
8
9
public class Person{
    //年齡
    private int age;
    //性別
    private String sex;
    //信息
    private String msg;
        
    //getter and setter<br>}

 兩個概念

 在開始創建規則項目之前,還需要明確兩個概念:

XOM:執行對象模型,就是規則引擎執行規則過程中所使用的對象,可以是java bean對象,如上文的 Person,也可以是XML

BOM:業務對象模型,其實就是XOM的一個映射,將XOM中的程序描述語言映射成業務描述語言,如:將age屬性映射成年齡,將sex屬性映射成性別,主要是用來方便業務人員(非IT)維護規則。

開發規則

 明白了業務場景和理解了以上的兩個概念,我們就可以開始開發規則項目了

打開Rule Designer編輯器,首先我們需要創建一個普通的java項目,該項目中只包含XOM對象

在編輯器的“規則資源管理器”內鼠標右鍵》新建》項目》java項目,輸入名稱:Person-xom,點擊完成。

在person-xom項目中創建Person.java類(即上文給出的Person java bean)

創建一個規則項目

在編輯器的“規則資源管理器”內鼠標右鍵》新建》項目》規則項目

點擊“下一步”,

輸入項目名稱:PersonRule,點擊“下一步”,

沒有其他規則項目需要引用,點擊“下一步”,

XOM設置中,選擇創建的Person-xom項目,點擊“下一步”,

 

沒有動態XOM,直接點擊“完成”。

此時,我們的規則項目已經創建好了,整體的項目結構如下:

鼠標點擊一下規則項目,編輯器會顯示“規則項目圖”視窗:

如果沒有顯示這個視圖,可以通過如下操作打開此視窗:窗口》顯示視圖》規則項目圖,這個視圖類似一個規則項目的導航,顯示着當前規則項目已經具備了哪些結構,還有哪些結構需要完善,其中,藍色的導航是可以操作的結構,如:導入XOM,創建BOM等,因爲我們在創建規則項目的時候已經將Person-xom導入進項目,所以,視圖中“導入XOM”導航條目後面會跟一個(1),當然,如果需要,可以點此條目導航繼續添加XOM;還有另一部分導航條目是灰色的,這是因爲要設置這些條目內容是需要前置條件的,如:“定義參數”導航條目需要“創建BOM”之後纔可用,瞭解了這些,就可以根據整個視圖的導航來一步步完成我們規則項目內容的創建了,在此多說一句,以上導航條目都可以在項目上右鍵鼠標找到,但是建議使用“規則項目圖”,可以更方便和更直觀的對整個規則項目進行把控。

點擊“創建BOM”導航

 

輸入名稱:person,勾選“從XOM創建BOM條目”,點擊“下一步”,

點擊“瀏覽XOM”按鈕,

選擇person-xom,點擊“確定”,

勾選Person類,點擊“下一步”,

將“所有方法”勾選,點擊“完成”按鈕。

到此處,我們便完成了BOM的創建,此時,查看“規則項目圖”視圖中的“創建BOM”導航條目後面也會出現一個(1),說明,我們創建BOM成功。

如上圖,因爲我們創建了BOM,所以“定義參數”導航條目也變成可用的了,但是,先不急定義參數,BOM創建完成之後,還需要對其進行編輯,將它的各個屬性映射成業務相關語言,生成編輯規則時可用的詞彙表。(這一步不是必須需要,如果你能保證以後規則的維護都是IT人員,那麼不用做此不操作,如果保證不了,還是需要完成此不操作,這樣有助於非IT人員對規則的編輯和維護,這也是ODM的強大之處)

創建完成BOM之後,規則項目目錄結構如下:

在規則項目中,雙擊創建的BOM(Person類),打開BOM信息展示視圖

在這個視圖的右上“類語言描述部分”中有一個“術語”條目

將術語中的“person”修改爲“人員”,並進行保存,這樣便完成了類名從person到人員的映射設置。

在規則項目中雙擊BOM對象的age屬性,

打開此屬性信息視圖,

細心的朋友可能注意到了,通過切換視圖下面的tab頁也可以切換各個視圖。在這個視圖中,點擊“編輯短語中使用的主題”,

將age修改爲 年齡,點擊 確定,

此時,在導航和操作中的語言已經將age轉換成了 年齡,我們還需將 操作 中的 age修改爲 年齡,

點擊保存(Ctrl+S)。

然後按照以上過程將所有屬性進行映射設置:

info:信息;

sex:性別;

完成了如上設置,我們可以查看“詞彙表”,來查看剛纔我們設置的詞彙:

如果沒有詞彙表視圖,可以通過:窗口》顯示視圖》詞彙表,來打開。

至此,我們完成了BOM的創建及詞彙表的映射操作。

讓我們回到“規則項目圖”,點擊“定義參數”導航條目,

 點擊“添加”按鈕,添加一個參數,

進行參數相關屬性設置,參數名輸入person,方向選在IN_OUT,語言描述設置爲:人員,點擊類型中的導入按鈕,進行類型選擇:

輸入關鍵字模糊查詢,選擇Person類型,點擊“確定”按鈕:

點擊“確定”,完成參數定義,如果需要定義多個參數,按照此步驟添加即可。

回到“規則項目圖”,點擊“添加規則包”導航條目,添加規則包過程與我們創建正常的java package一樣,需要注意路徑,要將規則包放在規則項目的“規則”這個包的下面,這裏不再逐步介紹,需要創建的規則包名如下:

1、checkAge

2、checkSex

創建規則包之後的項目結構如下圖:

繼續回到“規則項目圖”視圖,此時我們可以選擇的操作有很多,我們選擇“添加操作規則”導航條目進行點擊,

在這個窗口中,包選擇checkAge包,名稱輸入:年齡檢查,點擊“完成”。

以相同的方式在checkSex包下創建 性別檢查 操作規則,創建完成之後的項目結構如下:

接下來,開始編輯規則,雙擊“年齡檢查”操作規則,打開操作規則編輯視窗,

此時,確定光標在“內容”模塊內,使用快捷鍵“Ctrl+Shift+空格”彈出詞彙表,選擇 如果<條件>

選擇之後,顯示如下:

其中<條件>相當於一個替代符,點擊這個替代符,可以選擇相應的詞彙,如圖

 這個人員就是我們在 設置參數 操作中設置的參數,因爲我們要對人員信息進行規則檢查,所以這裏選擇 “人員”,

選擇“人員”之後編輯器會自動帶出人員相關的操作詞彙,如上圖,因爲這條規則是對人員的年齡進行檢查,所以這裏選擇“的年齡”,

同理,選擇“年齡”之後編輯器會提示下一步的操作預選項,還記的業務中的規則條件嗎? 人員 年齡 小於 18 歲,不檢查性別並設置人員信息爲“未成年人”,在這裏,我們選擇 小於<一個數字>,

然後將<數字>佔位符換成18,此時規則條件便設置完成了,

接下來,繼續使用快捷鍵“Ctrl+Shift+空格”,選擇 那麼<操作>,

點擊操作,

根據業務需求,選擇“設置<一個人員>的當前信息爲<一個字符長>”,

之後,點擊<一個人員>將佔位符換成“人員”,將<一個字符串>換成"未成年人"

注意,操作結尾要跟“;”號,但條件中不用“;”號。

這樣,我們年齡檢查的操作規則就編輯好了,是不是很簡單?到此處,我想朋友們對爲什麼映射BOM各屬性到詞彙表也有了一個更清晰的認識了,這樣使用起來的確很方便,而對於非IT人員來說,也大大減低了培訓成本。

接下來,以同樣的方式將另一條操作規則編寫完成,性別檢查的原始需求如下:

人員的年齡>=18歲,檢查人員性別,設置人員信息爲“成年女/男性”;

編輯完成的性別檢查操作規則如下圖:

這裏有朋友可能會問了,年齡大於18是是否進行性別檢查的先導條件?爲何在性別檢查的規則中沒有年齡檢查?這便引起了我們下一個要完善的工作,添加規則流,在這個過程中你會明白,規則流會幫我們控制規則的執行流向。

添加規則流操作之前,我先介紹一下什麼是規則流,從字面意義上來理解,規則流就是控制規則流向的一個組件,每一個規則項目中必須包含一個規則集,規則集中包含着至少一條的操作規則和規則流,操作規則排布在規則流上,規則集按照規則流流向執行規則,有點繞,大家可以理解一下。

接下來,添加規則流,同樣回到“規則集視圖”,點擊“添加規則流”導航條目,

包名不用填寫,創建在“規則”包下即可,名稱填寫:PersonCheck,點擊完成,添加之後的規則項目結構圖如下:

雙擊規則流,打開規則流編輯器,

做過工作流的朋友有可能會感到熟悉,規則流的編輯類似工作流的編輯,編輯器左邊的一列按鈕大家可以將鼠標放在上面查看分別代表什麼含義,編輯器支持拖拽,我們先創建一個開始和結束按鈕,

 接下來,需要將操作規則拖拽進編輯器,

使用鏈接線將各部分進行鏈接,同時,在這個過程中控制規則流向要符合業務,

現在,解析一下我設置的規則流程,如圖,規則從開始執行,先執行了 “年齡檢查”操作規則,之後從年齡檢查規則流出,這時候有兩條流向1和2,它們是互斥關係,我將1那條線路設置如下條件“如果,人員年齡小於18歲”,如果符合此條件,規則就按此條線路走,結束規則,這樣就避免了性別檢查,反之,會進行性別檢查,之後結束,圖中可以看到有錯誤提示,設置完線路的判斷條件即可關閉錯誤提示,點擊1那條線路,查看“屬性”視窗(如爲打開此視窗,請窗口》顯示視圖》屬性,打開),

標籤輸入:年齡判斷,勾選“將BAL用於轉換條件”,將光標焦點定位在下面空白處,使用快捷鍵導出詞彙表,完成如下圖條件設置,

點擊保存,此時,規則流視圖中不再出現錯誤提示,並顯示設置的條件標籤,整個規則流如下圖,

至此,我們便完成了整個規則項目的創建工作。

因爲,篇幅原因,這一片就寫到這裏,我會在下一篇中詳細說明如何來對規則項目進行測試。關於規則項目中的其他的所有知識點,也會在後續的章節中一點一點詳細介紹出來,如果,您有任何疑問或者問題,都可以給我留言或評論,我會在第一時間回覆您。

寫博客真的不易,如果您感覺這片博客對您有幫助,歡迎轉載,但請您務必註明出處,感謝!!!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章