Jeffrey's Sky

          Go with wind
          隨筆 - 14, 文章 - 1, 評論 - 15, 引用 - 0
          數(shù)據(jù)加載中……

          Drools 規(guī)則引擎的使用總結(jié)

              前一段時間在開發(fā)了一個做文本分析的項目。在項目技術(shù)選型的過程中,嘗試使用了Drools規(guī)則引擎。讓它來作為項目中有關(guān)模式分析和關(guān)鍵詞匹配的任務(wù)。但后來,因為某種原因,還是撇開了Drools。現(xiàn)將這個過程中使用Drools的一些經(jīng)驗和心得記錄下來。
          (一)什么時候應(yīng)該使用規(guī)則引擎
              這實(shí)際是一個技術(shù)選型的問題。但這個問題又似乎是一個很關(guān)鍵的問題(一旦返工的話,你就知道這個問題是多么重要了)。不知大家有沒有過這樣的經(jīng)驗和體會。往往在項目開始的時候,總會遇到應(yīng)該選用什么技術(shù)?是不是應(yīng)該使用最新的技術(shù)?或者應(yīng)該選用什么技術(shù)呢(PS:現(xiàn)在計算機(jī)軟件中的各種技術(shù)層出不窮,具有類似功能的技術(shù)很多)?
              不管怎么樣,這些問題總會困擾著我。比如,這次的這個項目。項目要求是要在一些log文件中(這些log文件都是很大的應(yīng)用系統(tǒng)所產(chǎn)生的,但由于legacy的原因,log本身的維護(hù)和規(guī)范工作一直沒有得到改善,所以想借助于一些外部應(yīng)用對這些log做以分析和清洗)抽取出有用的信息。
              于是,第一個想到的就是,這是一個文本挖掘類的項目。但又想,要抽取有用信息,必須得建立一些規(guī)則或pattern(模式)。所以,我第一個想到了規(guī)則引擎。因為這里面要建立好多規(guī)則,而這些規(guī)則可以獨(dú)立于代碼級別(放到一個單獨(dú)的drl文件里)并可以用規(guī)則引擎去解析和執(zhí)行。另一個重要的原因是,我原來用過,比較熟悉。這樣,也可以節(jié)省開發(fā)時間吧。于是,好不猶豫的就開始做了Demo....
              但事實(shí)上,在經(jīng)歷了一個多星期的編碼、測試后,我發(fā)現(xiàn)運(yùn)用規(guī)則引擎實(shí)在是太笨拙了。
              (1)首先必須建立一些數(shù)據(jù)模型。通過這些模型來refer規(guī)則文件中的LHS和Action。
              (2)還要考慮規(guī)則的conflict。如果有一些規(guī)則同時被觸發(fā),就要考慮設(shè)定規(guī)則的優(yōu)先級或者是設(shè)定activiation-group來保證在一個group中的規(guī)則只有一個規(guī)則可以被觸發(fā)。
              (3)對于‘流’規(guī)則group ruleflow-group的使用。如果要控制在workingmemory中的規(guī)則被觸發(fā)的順序,則可以將這些規(guī)則分組。然后,通過規(guī)則建模的方式來實(shí)現(xiàn)。但這也添加了一定的effort。修改或者更新不大方便。
              所以,基于上述體會,我更認(rèn)為規(guī)則引擎更適用于那些對非流程性規(guī)則匹配的應(yīng)用。當(dāng)然,Drools也支持對流程性規(guī)則的建模過程。但,這也許不是最好的方式。
          (二)Drools規(guī)則引擎的使用雜記
              (1)Fact 的變更監(jiān)聽。在Drools里,如果一個Fact通過規(guī)則而改變,則需將這種改變通知給規(guī)則引擎。這里,一般有兩種方式:顯式和隱式。
                   顯式---在drl文件中通過 update、modify來通知;在程序中,通過Fact的引用調(diào)用modifyObject等方法來實(shí)現(xiàn)。
                   隱式---通過在java bean實(shí)現(xiàn)property Listener Interface來讓引擎自動監(jiān)聽到屬性值的變化。我更習(xí)慣于這種方式。因為,一般看來凡是在規(guī)則引擎中添加到fact都是希望引擎來幫你進(jìn)行管理的。所以,那它自己看到fact的變化是種很省事的辦法。也很簡單,就是用java bean property 監(jiān)聽的方式。
                   通過StatefulSession來注冊。
                   調(diào)用StatefulSession的某個instance 的insert(Object,true)實(shí)現(xiàn)。而這個object是一個java bean。其中,要實(shí)現(xiàn)
                
                  
          private final PropertyChangeSupport changes  = new PropertyChangeSupport( this );
              public void addPropertyChangeListener(final PropertyChangeListener l) {
                  this.changes.addPropertyChangeListener( l );
              }

              public void removePropertyChangeListener(final PropertyChangeListener l) {
                  this.changes.removePropertyChangeListener( l );
              }
            
                  然后在set方法中調(diào)用
              this.changes.firePropertyChange( "temp",null,this.temp );
               (2)規(guī)則觸發(fā)的優(yōu)先級、組設(shè)置
              往往,在設(shè)計我們自己的規(guī)則時,要考慮規(guī)則的觸發(fā)條件。這不僅限于LHS的條件部分,還有規(guī)則本身被觸發(fā)的有些設(shè)置等等。這里,列出一些比較常用和有效的規(guī)則優(yōu)先級設(shè)置方式,以及需要注意的地方。
                   A.通過Salience方式。此值可正可負(fù)。越大優(yōu)先級越高,也會被引擎首先執(zhí)行。
                   B.通過ruleflow-group 方式。實(shí)際上,使用這種方式也就是在使用建立規(guī)則流的方式。在Eclipse 3.3 中,Drools提供了建立規(guī)則流的插件。要在drl的同級目錄中建立rf和rfm兩個文件(當(dāng)然,插件會幫助你建立這些)。
                  
          選擇RuleFlow File。
                這里,需要注意的一點(diǎn)是要在啟動規(guī)則引擎的時候,加入啟動rule flow的代碼。

               InputStreamReader source = new InputStreamReader(RuleManager.class
                              .getResourceAsStream(rule_path));
                     PackageBuilder builder = new PackageBuilder();
                      builder.addPackageFromDrl(source);
                      builder.addRuleFlow(new InputStreamReader(RuleManager.class
                              .getResourceAsStream(rule_flow_path)));
                     Package pkg = builder.getPackage();
                      RuleBase ruleBase = RuleBaseFactory.newRuleBase();
                      ruleBase.addPackage(pkg);
                然后,在每次啟動規(guī)則引擎的時候,調(diào)用如下方法:

                      StatefulSession ss;
                      ss.startProcess(flowProgress);
                      ss.fireAllRules();

                      flowProgress 是一個string類型。這個flow的名字。

          這個rule flow圖中,顯示了一個簡單的規(guī)則流。如RSA就是一個rule-flow的名字。在這個rule set中可以設(shè)定一組rules。這樣,就可以分開規(guī)則執(zhí)行的順序。在于rf和rfm同名的另一個 drl文件中定義這些組的名字。通過關(guān)鍵字 ruleflow-group 來表明。
              C.通過activation-group的方式。通過這種方式,可以exclude一組rule中一旦有一個rule被invoke,而其它rule不會被execute。同時,可以搭配使用salience關(guān)鍵字來標(biāo)明每個rule的優(yōu)先級,這樣就能夠使得你想要的一般性概念的rule先被匹配執(zhí)行。
              D.在使用ruleflow-group 的時候要注意使用lock-on-active true 關(guān)鍵字在每個rule。這樣可以避免一旦有rule被觸發(fā),不會造成循環(huán)匹配執(zhí)行。
              E.如果在LHS部分,需要調(diào)用某個方法來返回真、假值作為判斷的一個條件,那么可以用eval函數(shù)。
              如,eval(pattern.matched(5,$line.getCurrLine()))
              其中,pattern是某個加入到workingmemory中的一個實(shí)例。matched是這個實(shí)例所代表類的一個方法。它返回boolean類型。
             
            (3)Drools規(guī)則引擎的使用感受
             
          總之,Drools還是一個很不錯的開源規(guī)則引擎。現(xiàn)在v4.0以上的版本已經(jīng)比以前的版本在速度上有了很大的提升。可以作為我們一般應(yīng)用程序系統(tǒng)的中間件產(chǎn)品(那些規(guī)則不是很經(jīng)常改變的系統(tǒng),已經(jīng)非流程類規(guī)則)。但是,這其中還是需要一些額外的effort來學(xué)習(xí)它的使用文檔以及整體架構(gòu),有一定的學(xué)習(xí)曲線。
            
              最后,我想一個較好的對于技術(shù)使用的practice就是:首先知道它能為你做什么,它最好的應(yīng)用領(lǐng)域,然后再去深入。
             
              (PS:如果誰有使用Drools的問題,可以聯(lián)系我!一起討論!)

               
              

          posted on 2008-11-04 14:19 Jeffrey Feng 閱讀(13643) 評論(13)  編輯  收藏 所屬分類: 開源技術(shù)

          評論

          # re: Drools 規(guī)則引擎的使用總結(jié)  回復(fù)  更多評論   

          最后哪句話比較中聽
          2008-11-04 15:43 | 小高

          # re: Drools 規(guī)則引擎的使用總結(jié)[未登錄]  回復(fù)  更多評論   

          感覺 你用drools 來分析log 有點(diǎn) 用大炮來打鳥了
          個人之言
          2008-11-04 15:51 | garfield

          # re: Drools 規(guī)則引擎的使用總結(jié)  回復(fù)  更多評論   

          感謝garfield、小高的回復(fù)。我也覺得是,后來就轉(zhuǎn)向用正則表達(dá)式和有限狀態(tài)機(jī)來分析了。這里,只是貼一些使用Drools過程中的一些體會。
          2008-11-06 13:49 | Jeffrey Feng

          # re: Drools 規(guī)則引擎的使用總結(jié)[未登錄]  回復(fù)  更多評論   

          我有一片Dools使用文檔,請參考我的blog

          http://www.aygfsteel.com/jspark
          2008-11-06 17:39 | jspark

          # re: Drools 規(guī)則引擎的使用總結(jié)[未登錄]  回復(fù)  更多評論   

          想問一下,到底哪種項目適合 規(guī)則引擎
          2008-11-12 11:43 | lg

          # re: Drools 規(guī)則引擎的使用總結(jié)  回復(fù)  更多評論   

          基于我的經(jīng)驗,我認(rèn)為規(guī)則引擎主要適用于規(guī)則邏輯復(fù)雜,規(guī)則本身經(jīng)常刪改的大型應(yīng)用。比如,BPM,Business Optimization等。在這些項目中,規(guī)則引擎實(shí)際上是作為業(yè)務(wù)處理層所使用的外部插件來使用的。處理接口不變,變得只是邏輯規(guī)則本身。
          2008-11-19 12:58 | Jeffrey Feng

          # re: Drools 規(guī)則引擎的使用總結(jié)  回復(fù)  更多評論   

          我正在做一個對話引擎方面的項目,對話的組織和狀態(tài)是個麻煩的事情,
          我的msn是:dw8848@gmail.com
          希望能和jeffrey交流
          2008-12-08 15:21 | dw8848

          # re: Drools 規(guī)則引擎的使用總結(jié)  回復(fù)  更多評論   

          很高興交流。我的msn是fxfx_001@hotmail.com.
          2008-12-10 13:36 | Jeffrey Feng

          # re: Drools 規(guī)則引擎的使用總結(jié)  回復(fù)  更多評論   

          Drools是規(guī)則引擎,主要是用于實(shí)現(xiàn)基于規(guī)則的專家系統(tǒng)的。而專家系統(tǒng)是什么,要解決什么樣的問題,可能大家不是很清楚。所以在解決問題是,要首先有個全面的了解才行。如果只是流程型的東西,可以考慮工作流引擎實(shí)現(xiàn)。
          另外,對話引擎是很復(fù)雜的,涉及很多技術(shù),NPL、推理機(jī)、知識庫,甚至包含整個人工智能領(lǐng)域的技術(shù)。而其中每個技術(shù)又有不同的理論和方法,選擇哪個,又如何組合這些技術(shù)也是很復(fù)雜的。
          2008-12-17 11:44 | hanguokai

          # re: Drools 規(guī)則引擎的使用總結(jié)  回復(fù)  更多評論   

          基于條件匹配方式的規(guī)則引擎必定存在一個抽象分析的過程,而且你很難控制流程式的邏輯的執(zhí)行。
          我們做的VisualRules也稱做一個規(guī)則引擎產(chǎn)品,但是我們不是按照條件匹配的方式來做的。我們是順序執(zhí)行的。因此可以通過分支來實(shí)現(xiàn)決定規(guī)則執(zhí)行的軌跡,甚至可以做循環(huán)類的規(guī)則。另外可以直接在規(guī)則中操作數(shù)據(jù)庫,以便于提取一些參數(shù)以及存取操作。
          其實(shí)最開始我們研發(fā)這個產(chǎn)品時,也碰到匹配算法將規(guī)則配置變得非常難,研究挺長時間的程序員要設(shè)計規(guī)則都覺得分析的難度挺大。不要說將來的維護(hù)人員或者業(yè)務(wù)人員。
          因此我們的目標(biāo)是使邏輯配置變得簡單,有機(jī)會歡迎探討。
          2009-04-26 08:15 | 旗正技術(shù)

          # re: Drools 規(guī)則引擎的使用總結(jié)  回復(fù)  更多評論   

          我最近也在研究drools,剛剛接觸,遇到了個問題,我插入了一些事實(shí),然后激活了規(guī)則,但是在執(zhí)行規(guī)則的過程中,還會insert一些事實(shí),但是,規(guī)則中的有些需要起初的事實(shí),和后面插入的事實(shí)共同滿足的條件下才能執(zhí)行的規(guī)則,就執(zhí)行不了了,怎樣才能解決這個問題呢
          2010-02-25 13:56 | zhoue

          # re: Drools 規(guī)則引擎的使用總結(jié)  回復(fù)  更多評論   

          如果有誰要是知道的話,請不吝賜教,QQ:1210046822
          謝謝先
          2010-02-25 13:58 | zhoue

          # re: Drools 規(guī)則引擎的使用總結(jié)  回復(fù)  更多評論   

          We were flying from Los Angeles to Washington, D.C, when I answered a lavatory call light in the coach cabin. There I found a young mother struggling with herhttp://www.4uaj.com
          2010-04-01 16:22 | jordan shoes
          主站蜘蛛池模板: 五指山市| 安顺市| 辽宁省| 马鞍山市| 赤城县| 永州市| 阜康市| 顺平县| 南城县| 芦溪县| 河南省| 达拉特旗| 义乌市| 密山市| 榆中县| 巴中市| 利津县| 公主岭市| 石林| 鲁甸县| 石楼县| 汉川市| 栾城县| 永修县| 印江| 临城县| 长丰县| 唐河县| 南投县| 东宁县| 商丘市| 扶沟县| 大竹县| 华阴市| 府谷县| 邛崃市| 南丹县| 莱芜市| 团风县| 句容市| 敖汉旗|