Skip to main content

Posts

Showing posts from February, 2013

JBoss BRMS - Rules 語法與範例信用卡程式

今年年初我會多花一些時間翻譯以及多介紹BRMS的部分。

JBoss Rules 是JBoss BRMS 裡面專門管理商業邏輯的部分,像是客戶是否符合打折的條件啊,什麼條件下應該要將倉庫的貨品拍賣等等的...
以人類的腦子裡面,通常我們是怎麼判斷邏輯的呢?
通常都是向下面一樣,

也就是會先設想一些條件,再來判斷要做的事情。要寫一條JBoss 的規則邏輯很簡單。跟人類大腦判斷的基本上也差不多。基本上,大概就分成幾個部分,


大部份要做的事情都在When 與 then 就做掉了。
語法很簡單, 只要會一點程式設計的人都可以很快上手,大多是 ==. >=, <=...等等...

有一些設定與規則的fire 順序與方式比較有關係,所以特別寫在上面註記一下:


no-loop
預設值: false
類型: Boolean
設定 no-loop為true可以防止這個規則邏輯有任何變動,會觸發其它的規則,導致無窮迴圈。

lock-on-active
預設值: false
類型: Boolean
no loop 的加強版,因為會其他的rule會觸發結果,也會有無窮迴圈的狀況產生,
因此,在這個 ruleflow group 或是 agenda group 啓動時,設定的rule只有一次。

salience
預設值: 0
類型: integer
設定執行的順序,數字越大優先等級越高


以下我們來寫利用JBoss BRMS 一個簡單的Drools 程式,並且在BRMS 上面建立一個測試的策略,以後修改規則都可以拿這個策略去確認是否正確。

1. 安裝JBoss BRMS, 我使用比較簡單的standalone 版本,也就是brms-standalone-x 的版本,基本上就是解壓縮,然後去JBoss 裡面的EAP 把brms-users.properties 裡面的使用者設定打開即可。(以前寫過JBoss EAP 設定,這裡我就不再多說了..)

2. 建立JBoss Drools Project.. 這次要寫的是信用卡的自動核准規則。

選擇建立Drools Project


輸入名字CreditCardVIP,

 因為這次不需要Sample, 所以把選項拿掉


確認Runtime 環境有正確設定,按下Finish 即可。



像是開發普通的系統一樣,先建立幾個物件,在src/main/java 底下建立 Cus…

JBoss BRMS - JBoss Rules 的 RETE 演算法

恭喜發財!新年快樂 ! 放了年假回來才發現這篇遲遲沒有發,

JBoss Rules 是屬於JBoss BRMS 的其中一環。
JBoss BRMS 是一個給企業建制整合商業邏輯,商業流程以及商業事件的平台。


而同上圖一樣,JBoss Rules 就是負責建制商業邏輯的一部分。

很多人都會問我,請問JBoss Rules 的效能好不好,再好的效能,如果用了很差的寫法一樣都會差的。要寫得好,也要先了解JBoss Rules 的內部演算方式。

JBoss Rules 的演算方式,始使用類似google 搜尋的演算法,這個演算法是Dr. Charles Forgy 在1982年發表的。 RETE 這個名字在拉丁文的意思是"網路"。簡單來說,這個就是在計算Rules如何在記憶體裡面建立網路,然後如何在這個建立的網路中"過濾"到出現結果。

這種演算法比一般的Rules快速多了,以前,在我很"年輕"的時候,我也有想做過同樣的事情,因此,我設計了一套邏輯,讓那些負責制定晉升規則的非IT人也可以去定義,所謂的保險業務員升遷邏輯,例如說,在幾月幾日之前,第一年保險費累積超過XX, 且其中的健康險保費佔了xxx%,且屬下的保費累積大於xxx, 等等等複雜,它就可以晉升。
為了要確認每個條件都被跑過,必須要下很多次的迴圈確認。 唉~那時候如果有JBoss Rules 這種東西,應該省了不少功吧。


RETE 基本上有5個不同的部分,


Root Node
這沒啥好說的,就是開始的起始點。所以Fact 就是從這個起始點進入RETE的網路中。

Object Type Node
主要分類不同的物件,如這個範例中,有三個不同的物件,貓,食物與主人。

Alpha Network
初步的過濾,針對上一層OTN 的物件上面的限制,如範例分析貓這個物件,裡面的品種,市街貓還是波斯貓。


Beta Network
這是把兩個以上的過濾結果結合的步驟,Alpha node 後,會有個LeftInputAdapter 指引之後要連接的到Beta Network的位置。下面的範例則是把波斯貓以及飼料大於1,000元以上的結果結合在一起。

Terminal Node 
這就是結束的點,所有結束的點都代表著需要被執行的Activation,而這些Activation 就…