<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jeffrey's Sky

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

    Drools 規則引擎的使用總結

        前一段時間在開發了一個做文本分析的項目。在項目技術選型的過程中,嘗試使用了Drools規則引擎。讓它來作為項目中有關模式分析和關鍵詞匹配的任務。但后來,因為某種原因,還是撇開了Drools。現將這個過程中使用Drools的一些經驗和心得記錄下來。
    (一)什么時候應該使用規則引擎
        這實際是一個技術選型的問題。但這個問題又似乎是一個很關鍵的問題(一旦返工的話,你就知道這個問題是多么重要了)。不知大家有沒有過這樣的經驗和體會。往往在項目開始的時候,總會遇到應該選用什么技術?是不是應該使用最新的技術?或者應該選用什么技術呢(PS:現在計算機軟件中的各種技術層出不窮,具有類似功能的技術很多)?
        不管怎么樣,這些問題總會困擾著我。比如,這次的這個項目。項目要求是要在一些log文件中(這些log文件都是很大的應用系統所產生的,但由于legacy的原因,log本身的維護和規范工作一直沒有得到改善,所以想借助于一些外部應用對這些log做以分析和清洗)抽取出有用的信息。
        于是,第一個想到的就是,這是一個文本挖掘類的項目。但又想,要抽取有用信息,必須得建立一些規則或pattern(模式)。所以,我第一個想到了規則引擎。因為這里面要建立好多規則,而這些規則可以獨立于代碼級別(放到一個單獨的drl文件里)并可以用規則引擎去解析和執行。另一個重要的原因是,我原來用過,比較熟悉。這樣,也可以節省開發時間吧。于是,好不猶豫的就開始做了Demo....
        但事實上,在經歷了一個多星期的編碼、測試后,我發現運用規則引擎實在是太笨拙了。
        (1)首先必須建立一些數據模型。通過這些模型來refer規則文件中的LHS和Action。
        (2)還要考慮規則的conflict。如果有一些規則同時被觸發,就要考慮設定規則的優先級或者是設定activiation-group來保證在一個group中的規則只有一個規則可以被觸發。
        (3)對于‘流’規則group ruleflow-group的使用。如果要控制在workingmemory中的規則被觸發的順序,則可以將這些規則分組。然后,通過規則建模的方式來實現。但這也添加了一定的effort。修改或者更新不大方便。
        所以,基于上述體會,我更認為規則引擎更適用于那些對非流程性規則匹配的應用。當然,Drools也支持對流程性規則的建模過程。但,這也許不是最好的方式。
    (二)Drools規則引擎的使用雜記
        (1)Fact 的變更監聽。在Drools里,如果一個Fact通過規則而改變,則需將這種改變通知給規則引擎。這里,一般有兩種方式:顯式和隱式。
             顯式---在drl文件中通過 update、modify來通知;在程序中,通過Fact的引用調用modifyObject等方法來實現。
             隱式---通過在java bean實現property Listener Interface來讓引擎自動監聽到屬性值的變化。我更習慣于這種方式。因為,一般看來凡是在規則引擎中添加到fact都是希望引擎來幫你進行管理的。所以,那它自己看到fact的變化是種很省事的辦法。也很簡單,就是用java bean property 監聽的方式。
             通過StatefulSession來注冊。
             調用StatefulSession的某個instance 的insert(Object,true)實現。而這個object是一個java bean。其中,要實現
          
            
    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方法中調用
        this.changes.firePropertyChange( "temp",null,this.temp );
         (2)規則觸發的優先級、組設置
        往往,在設計我們自己的規則時,要考慮規則的觸發條件。這不僅限于LHS的條件部分,還有規則本身被觸發的有些設置等等。這里,列出一些比較常用和有效的規則優先級設置方式,以及需要注意的地方。
             A.通過Salience方式。此值可正可負。越大優先級越高,也會被引擎首先執行。
             B.通過ruleflow-group 方式。實際上,使用這種方式也就是在使用建立規則流的方式。在Eclipse 3.3 中,Drools提供了建立規則流的插件。要在drl的同級目錄中建立rf和rfm兩個文件(當然,插件會幫助你建立這些)。
            
    選擇RuleFlow File。
          這里,需要注意的一點是要在啟動規則引擎的時候,加入啟動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);
          然后,在每次啟動規則引擎的時候,調用如下方法:

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

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

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

         
        

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

    評論

    # re: Drools 規則引擎的使用總結  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結[未登錄]  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結[未登錄]  回復  更多評論   

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

    http://m.tkk7.com/jspark
    2008-11-06 17:39 | jspark

    # re: Drools 規則引擎的使用總結[未登錄]  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結  回復  更多評論   

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

    # re: Drools 規則引擎的使用總結  回復  更多評論   

    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
    主站蜘蛛池模板: 成人网站免费看黄A站视频| 亚洲AV一区二区三区四区| 72pao国产成视频永久免费| 国产免费久久精品| 鲁死你资源站亚洲av| 69成人免费视频无码专区| 亚洲一区二区三区久久久久| 1000部拍拍拍18勿入免费视频下载| 亚洲国产精久久久久久久| 97av免费视频| 亚洲一区二区三区无码国产| 曰批全过程免费视频在线观看| 日韩亚洲国产高清免费视频| 日本免费观看网站| japanese色国产在线看免费| 亚洲熟妇无码AV在线播放| 国产好大好硬好爽免费不卡| 亚洲成综合人影院在院播放| 免费可以在线看A∨网站| 国产精品亚洲lv粉色| 国产亚洲成人久久| 久久精品毛片免费观看| 一本色道久久88—综合亚洲精品 | 亚洲AV无码成人精品区在线观看| 日韩视频在线观看免费| 亚洲噜噜噜噜噜影院在线播放| 大学生美女毛片免费视频| 日韩精品无码免费视频| 亚洲av中文无码乱人伦在线r▽| 麻豆国产精品免费视频| 亚洲欧美日韩中文字幕一区二区三区 | 台湾一级毛片永久免费| 国产亚洲精品精品精品| 亚洲成AV人片在线观看无码 | 久久国产免费福利永久| 亚洲A∨精品一区二区三区下载| 精品国产人成亚洲区| 91手机看片国产永久免费| 美女尿口扒开图片免费| 久久精品蜜芽亚洲国产AV| 国产无遮挡吃胸膜奶免费看|