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, 所以把選項拿掉 確認R

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  這就是