一花一世界,一葉一菩提
一 前言 最早對Drools感興趣,是起源于規(guī)則引擎.當(dāng)時是希望能找一個開源工具來做一些規(guī)則的處理. 在官方網(wǎng)站上翻了半天資料,卻發(fā)現(xiàn)Drools一直在強調(diào)它不只是一個簡單的規(guī)則引擎,而是更多的引入工作流的概念. 之后最大的感觸就是Drools牽涉到的東西比較多,甚至有一種依照Drools可以創(chuàng)造整個世界的感覺-- 這個世界本身不就是由各種規(guī)則/流程/事件構(gòu)成的么? 這也是本文標(biāo)題的由來. 以后會對Drools的各方面有一個比較深入的了解,因此這篇文章只是用來做簡單的介紹,希望能在短時間內(nèi)能讓其他人對Drools做什么,怎么做,有一個直觀的了解,以后遇到相關(guān)應(yīng)用的場景時,能想到Drools的解決方案. PS:PPT是在Team內(nèi)部的團隊分享時使用的,有一些鏈接可能會失效(外網(wǎng)無法訪問).本文內(nèi)容和PPT不會完全一致.不過問題不大了. 二.從規(guī)則引擎的應(yīng)用場景說起 昨天講解PPT的時候有人問到Drools和If-else的本質(zhì)區(qū)別在哪里.我想了想,還是想引用一句話來表述自己的感受. "南京一高職學(xué)生為了給男友發(fā)鯨魚寶寶的短信涉嫌偽造健康證明捐精買iphone4,。,。,。。" 2.1 各種棋類游戲 象棋圍棋五子棋跳棋軍棋撲克牌三國殺殺人游戲強權(quán)外交等等等等.游戲本身就是規(guī)則的代名詞. 2.2 業(yè)務(wù)規(guī)則 超市打折,匯率計算等等等等. 2.3 相通的場景 這些場景可能有一些相通的點,在這兒我可能總結(jié)的不會太全面,稍稍羅列一下:
這個時候用規(guī)則引擎來處理這些事情就相對來說容易多了.不過,Drools做的遠(yuǎn)遠(yuǎn)不止這些. 三 Drools的構(gòu)成. 目前Drools的最新穩(wěn)定版本是5.2.0.Final(23-Jun-2011). 現(xiàn)在由JBoss維護,分成五個模塊. 下面就簡單的介紹下每一個模塊的內(nèi)容,可以大致的了解下Drools的發(fā)展方向和可以用來解決問題的范疇. 3.1 Guvnor Guvnor是一個通過Web界面可以管理,更改規(guī)則的工具,也可以提供Repository的服務(wù).(似乎各種開源軟件里都會提供這樣的Web管理界面,Heritrix,Nutch,AllGeography等等等等).支持Dsl和QA. 3.2 Expert 傳統(tǒng)的規(guī)則引擎,應(yīng)該說Drools的核心,也是前身.通過Rete算法來實現(xiàn)模式匹配. 3.3 Jbpm5 工作流的處理交給了JBPM5這個模塊.這個模塊我了解的不多,大概知道的是除了工作流之外還提供了各種各樣的集成(Camel,Spring,Osgi等等,感覺這個模塊本身的規(guī)劃不是特別清晰).其中Camel適用于路由轉(zhuǎn)發(fā).有了解的較多的朋友可以指教一下,或者以后有時間我會再了解一下相關(guān)的內(nèi)容. 3.4 Fusion 用于做CEP的處理.本來是不太懂CEP的,這個概念接觸的不算多.不過看到了Wiki上的一個例子,大概明白一些. 摘錄如下: 引用 Among thousands of incoming events, a monitoring system may for instance receive the following three from the same source: 1.church bells ringing. 2.the appearance of a man in a tuxedo with a woman in a flowing white gown. 3.rice flying through the air. From these events the monitoring system may infer a complex event: a wedding 3.5 Planner Planer用來解決一系列的問題,如N皇后問題,TSP (話說這些問題有什么共同點我還沒有領(lǐng)會得到,大體的感覺是可以用來解決一些規(guī)劃問題,或者是說求解問題). 3.6 關(guān)系圖 這是我理解的關(guān)系圖. Expert還是核心,Fusion和Planer和Workflow都應(yīng)該是規(guī)則的應(yīng)用到具體領(lǐng)域的擴展,通過JBPM5還提供了和各種開源軟件的集成.Guvnor來提供各種資源的管理. 四 Expert 對Expert有了解就可以使用Drools了.所以我想還是總體的介紹下Expert的使用,這樣具體的細(xì)節(jié)其他朋友可以通過翻閱手冊來自己解決了. 列出幾個知識點: 1.Drl文件. Drl就是Drools用來描述規(guī)則的文件.DRL文件的結(jié)構(gòu)包括以下幾部分: 引用 package package-name imports globals functions queries rules Drl中可以通過Import的方式引入Model類,也可以調(diào)用Java的各種函數(shù). Drl中也可以自己定義Class和Function. Queries的應(yīng)用場景還不太了解,目前沒有用到過. Rules就是規(guī)則的部分,它的結(jié)構(gòu)如下: 引用 rule "name" attributes when LHS(The Rule Language) then RHS(Java,Pthyon,Groovy) end 每一條規(guī)則都有名稱. 每一條規(guī)則都有屬性(lock-on-active等) When里寫的是LHS(Left Hand Side,左手邊),等同于IF里的條件判斷.左手邊是Drools自己的語法規(guī)則,詳見Drools的文檔. Then里寫的是RHS(Right Hand Side,右手邊),等同于IF里的執(zhí)行語句.右手邊支持多種語言(Java,Pthyon,Groovy等). 2.規(guī)則文件的使用 Java代碼
Session分成兩種,一種是StateFul,一種是StateLess.區(qū)別是StateFul是可以完成推理的,即一條規(guī)則有可能導(dǎo)致另一條規(guī)則的觸發(fā),因此需要顯示的調(diào)用一下FireAllRules().而StateLess是不支持規(guī)則推理的.所以規(guī)則是自動觸發(fā). Employee 是一個簡單的Demo類,用來表示一個員工.這里想給出的是一個判斷員工上班是否遲到的示例,因此Employee可以設(shè)計成這個樣子. Java代碼
假設(shè)公司的遲到規(guī)則是九點鐘以后打卡就算遲到,那么規(guī)則就可以寫成這樣子. Drools代碼
將一個Model Insert進(jìn)去,調(diào)用FireAllRules方法,就是執(zhí)行了規(guī)則,Model的值就會發(fā)生改變. 這就是Expert使用的最簡單的方式. 3.產(chǎn)生式系統(tǒng) 規(guī)則引擎里的一些術(shù)語是來自于產(chǎn)生式系統(tǒng)的.如LHS,RHS,Fact,ProductMemory,WorkingMemory. LHS和RHS之前已經(jīng)提到過,下面來介紹一下其它的術(shù)語. Fact:每一條規(guī)則稱之為Fact. ProductMemory:保存Fact.如上例說到的遲到的規(guī)則. WorkingMemory:保存每一個實例,如上例說到的每一個員工. 可以把規(guī)則引擎理成一個WorkingMemeory和ProductMemory的模式匹配.有四種算法.(Linear,Rete,Treat,Leap). Drools使用的是Rete.據(jù)說也有Leap的實現(xiàn),后來因為無人使用也無人維護給放棄了. 4.Rete Rete是網(wǎng)絡(luò)的意思,簡單的說,Rete算法的思路就是事先將Fact構(gòu)建成一個過濾網(wǎng),這個過濾網(wǎng)由四種節(jié)點構(gòu)成.分別是Root,1-input(alpha),2-input(beta),terminal. 這四個節(jié)點也比較簡單,Root是入口,所有的實例都從Root出進(jìn)入Rete.Alpha用來做Literal的驗證(如"Name=段三品"),Beta節(jié)點用來做對象的驗證,如(employee1=employee2),terminal是終止節(jié)點. 一直在想一個簡單的方式能描述Rete做的功能.可以想象成從Root到Aplpha到Beta到Terminal是由不同的閥門構(gòu)成的水管. 從Root處開始往下倒各種液體(水,酒,醋等等,等同于WorkingMemory的一個個實例),對于各個節(jié)點來說,如果滿足自己的驗證條件,那么就可以放行.如果不滿足,就不通過.這樣最后從Terminal流出的就是匹配到的規(guī)則. 昨天又有人問到這個和有限狀態(tài)自動機的區(qū)別是什么.我想?yún)^(qū)別就在于每一個節(jié)點都保留了符合這個節(jié)點的WorkingMemory.而有限狀態(tài)自動機是不會保存這些內(nèi)容的. 以上是對Rete的簡單理解,希望能有朋友多指教. 符上一張圖(很遺憾忘記在哪兒粘過來的了,對原圖的作者表示歉意). 五 Guvnor Guvnor這部分,我想說的主要是關(guān)于Dsl的部分. Dsl其實大部分人已經(jīng)經(jīng)常用到了.只不過自己還不知道而已.如Shell,Uml,Sql,wiki Template. Guvnor支持Dsl的配置,DSL configurations的選項里可以新建,編輯Dsl文件.這里給出一個Guvnor安裝后自帶的例子. Dsl代碼
這樣在編輯規(guī)則的時候.就可以用Dsl語言去編寫規(guī)則了.有助于將業(yè)務(wù)邏輯從代碼中分離出去.將變化和非變化的部分分離開來. 六. 小結(jié) Drools對于規(guī)則的理解更深入,或者說是對于規(guī)則的應(yīng)用理解更深入.當(dāng)然這個世界是由什么來構(gòu)成的,不可能有一個準(zhǔn)確又有用的答案.可是至少在Drools的眼里,世界可以由規(guī)則組成. 有太多的內(nèi)容沒有涉及到了,所以還是希望這篇文章能夠做到之前對Drools給出一個感性的認(rèn)識,知道Drools能做什么事情,了解Drools怎么去做的.以后再面對項目需求時,在可以用到Drools的場景下,再去詳細(xì)查證手冊好了. 另外Drools的安裝包本身包含大量的示例程序.Reference做的也相當(dāng)不錯.都是很好的資料. |
|
來自: 埃德溫會館 > 《規(guī)則引擎》