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

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

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

    guangnian0412's BLOG

    Java in my life

    常用鏈接

    統計

    積分與排名

    我關注的Blog

    最新評論

    JBoss Rules 學習(三): Drools規則引擎 (上)

    從今天開始,我們將分兩期來詳細的介紹Drools規則引擎的原理,和各關鍵類的使用方法。

    Drools 規則引擎(上)

    1. 概述 :
    Drools 分為兩個主要部分:構建( Authoring )和運行時( Runtime )。

    構建的過程涉及到 .drl .xml 規則文件的創建,它們被讀入一個解析器,使用 ANTLR 3 語法進行解析。解析器對語法進行正確性的檢查,然后產生一種中間結構“ descr ”, descr AST 來描述規則。 AST 然后被傳到 PackageBuilder ,由 PackagBuilder 來產生 Packaged 對象。 PackageBuilder 還承擔著一些代碼產生和編譯的工作,這些對于產生 Package 對象都時必需的。 Package
    對象是一個可以配置的,可序列化的,由一個或多個規則組成的對象。下圖闡明了上述過程:
    ?
    Figure 1.1
    Authoring Components

    RuleBase 是一個運行時組件,它包含了一個或多個 Package 對象。可以在任何時刻將一個 Package 對象加入或移出 RuleBase 對象。一個 RuleBase 對象可以在任意時刻實例化一個或多個 WorkingMemory 對象,在它的內部保持對這些 WorkingMemory 的弱引用。 WorkingMemory 由一系列子組件組成。當應用程序中的對象被 assert WorkingMemory ,可能會導致一個或多個 Activation 的產生,然后由 Agenda 負責安排這些 Activation 的執行。下圖說明了上述過程:

    ?
    Figure 1.2 .?Runtime Components

    2.構建(Authoring):

    主要有三個類用來完成構建過程:DrlParser, XmlParser PackageBuilder。兩個解析器類從傳入的Reader實例產生descr AST模型。PackageBuilder提供了簡便的API,使你可以忽略那兩個類的存在。這兩個簡單的方法是:“addPackageFromDrl”和“addPackageFromXml”,兩個都只要傳入一個Reader實例作為參數。下面的例子說明了如何從classpath中的xmldrl文件創建一個Package對象。注意:所有傳入同一個PackageBuilder實例的規則源,都必須是在相同的package 命名空間(namespace)中。

    PackageBuilder?builder?=?new?PackageBuilder();
    builder.addPackageFromDrl(?
    new?InputStreamReader(?getClass().getResourceAsStream(?"package1.drl"?)?)?);
    builder.addPackageFromXml(?
    new?InputStreamReader(?getClass().getResourceAsStream(?"package2.drl"?)?)?);
    Package?pkg?
    =?builder.getPackage();


    Figure 2.1 PackageBuilder

    PackageBuilder是可以配置的,使用PackageBuilderConfiguration。通常,你可以指定另一個parent ClassLoader和用什么編譯器(compiler),默認是Eclipse JDT。下面顯示了如何指定JANINO編譯器:

    PackageBuilderConfiguration?conf?=?new?PackageBuilderConfiguration();
    conf.setCompiler(?PackageBuilderConfiguration.JANINO?);
    PackageBuilder?builder?
    =?new?PackageBuilder(?conf?);

    Figure 2.2 .?PackageBuilderConfiguration

    3
    RuleBase:

    Figure 3.1 .?RuleBase

    一個RuleBase包含了多個將被使用的規則包(packages of rules)。一個RuleBase是可以序列化的,所以它可以被配置到JNDI或其他類似的服務。通常,第一次使用時,一個RuleBase被創建并緩存。RuleBaseRuleBaseFactory來實例化,默認返回一個ReteOO RuleBase。可以傳入參數來指定采用ReteOOLeaps。然后,用addPackage方法加入Package實例。你可以加入有相同命名空間(namespace)的多個Package。

    RuleBase?ruleBase??=?RuleBaseFactory.newRuleBase();
    ruleBase.addPackage(pkg);

    Figure 3.2. RuleBaseFactory

    一個 rulebase instance 是線程安全的,所有你可以在你的應用中,讓一個 rulebase instance 在多個線程中共享。對于一個 rulebase 的最通常的操作是產生一個新的 WorkingMemory 。

    這個 rulebase 保持著到它所產生的 WorkingMemoryd 的弱引用,所以在長時間運行的 WorkingMemory 中,如果 rules 發生改變,這些 WorkingMemory 可以即使的根據最新的 rules 進行更新,而不必重啟 WorkingMemory 。你也可以指定 RuleBase 不必保持一個弱引用,但是你要保證 RuleBase 不用更新。

    ruleBase.newWorkingMemory();?? // ?maintains?a?weak?reference.
    ruleBase.newWorkingMemory(? false ?);? // ?do?not?maintain?a?weak?reference

    任何時候, Package 可以被加入或移除;所有的改變都會被反映到現存的 WorkingMemory 中。不要忘了調用 fireAllRules() Activations 激發。

    ruleBase.addPackage(?pkg??);?? // ?Add?a?package?instance
    ruleBase.removePackage(? " org.com.sample " ??);?? // ?remove?a?package,?and?all?its?parts, by?it's?namespace
    ruleBase.removeRule(? " org.com.sample " ,? " my?rule " ?);? // ?remove?a?specific?rule?from?a namespace

    雖然有刪除一個單獨規則的方法,但是卻沒有加入一個單獨規則的方法(要達到這個目的只有加入一個只有一條規則的 package )。

    RuleBaseConfigurator 可以指定 RuleBase 的附加行為。在加入 RuleBase 后, RuleBaseConfiguration 就變成不可變對象。

    RuleBaseConfiguration?conf? = ? new ?RuleBaseConfiguration();

    conf.setProperty(?RuleBaseConfiguration.PROPERTY_ASSERT_BEHAVIOR,
    ??????????????????RuleBaseConfiguration.WM_BEHAVIOR_EQUALITY?);

    RuleBase?ruleBase?
    = ? new ?ReteooRuleBase(?conf?);

    兩個主要的屬性是: PROPERT_ASSERT_BEHAVIOR PROPERTY_LOGICAL_OVERRIDE_BEHAVIOR (在以后的部分中會解釋)。所有的屬性值都是 RuleBaseConfiguration 類中的靜態域常量。


    Figure 3.3 RuleBaseConfiguration



    posted on 2006-06-04 12:50 guangnian 閱讀(22573) 評論(14)  編輯  收藏 所屬分類: JBoss Rules(Drools)

    評論

    # re: JBoss Rules 學習(三): Drools規則引擎 (上) 2006-06-08 00:02 steeven

    好文,謝謝~

    偶一直在想什么場合下需要rule engine.
    1. 如果邏輯在開發前就定好,雖然比較復雜,如果用rule engine,碰到重構,rule要手工操作。而且規則語法的錯誤不容易檢查出來。
    2. 如果要客戶來寫規則,讓客戶學習語法規則還是用界面生成呢?
      回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上) 2006-06-08 15:00 guangnian

    @steeven
    我想rule engine主要用在規則經常變化的情況在,此時只需要改動drl文件,而不需要改代碼。對于規則語法錯誤可以靠IDE工具來寫規則啊,JBoss已經有提供Eclipse plugin了。
    規則當然是程序員根據客戶的需求來寫的啊  回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上) 2006-11-22 18:09 syyhpf

    那測試呢?修改完規則后怎樣測試?在運行系統中?  回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上) 2006-11-30 14:55 coolfish

    應該有專門的測試環境吧  回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上) 2007-07-04 13:30 liujg

    所有傳入同一個PackageBuilder實例的規則源,都必須是在相同的package 命名空間(namespace)中.請問這里的package的命名空間是什么呢?  回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上) 2007-07-04 13:38 liujg

    看來今年沒有人關注該貼了!郁悶......  回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上)[未登錄] 2007-08-23 12:48 dd

    好文章啊,要是能給個具體的操作就好了..舉個例子就好了.我看的很迷糊  回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上)[未登錄] 2007-08-27 09:29 sclsch

    mark  回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上) 2007-11-24 15:32 myim

    我給個例子:
    電梯行業,

    如果樓層高是10層
    那么控制板上的按鈕就是10+5(其它功能)個
    如果載重1000公斤
    那么就選擇A型號的電機
    如果是前后開門
    那么加工路線就是R
    如果門是對開
    那么就選擇Item Number D作為這個合同的門類型來加工
    如果客戶要噴涂藍色的門
    那么就選擇噴涂加工路線,
    并且噴涂顏料選擇Item Number Blue
    。。。。

    類似的Rule可以達到幾萬條以上,不知道這個企業作用是否適合選擇DRools來做,真實地ERP中也使用Rule來做的。

    請問DRools在這樣的場景中是否物有所值?還是說DRools用在這樣的地方,大材小用了,他有更高級的用處?

    剛剛發現DRools, 非常有興趣研究
      回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上) 2008-01-18 14:16 ePim

    路過,今天開始接觸這個東本,好難入門啊~~  回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上) 2009-02-10 15:16 hc

    這個版本低了 很多屬性字段都不適用了   回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上) 2010-02-03 17:30 ddoo

    http://www.jboss.org/drools/documentation.html

    這上面有更詳細的文檔.  回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上)[未登錄] 2011-03-05 23:01 xiaogang

    請問文中所說的 descr AST中間結構是一種什么樣的結構???在網上搜不到相關資料,謝謝  回復  更多評論   

    # re: JBoss Rules 學習(三): Drools規則引擎 (上)[未登錄] 2014-03-21 14:19 Lee

    也就是說我可以用antlr把自己的規則語法映射到drools可是別的程度 so good  回復  更多評論   

    主站蜘蛛池模板: 日本媚薬痉挛在线观看免费| 91精品手机国产免费| 国产精品色午夜视频免费看| 一本到卡二卡三卡免费高| 国产成人高清精品免费鸭子| 日韩欧美亚洲中文乱码| 在线播放免费人成视频在线观看| 日本二区免费一片黄2019| 亚洲人成人伊人成综合网无码| 巨胸喷奶水www永久免费| 亚洲精品成a人在线观看| 免费的黄网站男人的天堂| 亚洲欧洲精品成人久久曰影片| 一级女性全黄生活片免费看| 亚洲精品和日本精品| www免费插插视频| 亚洲AV无码成人精品区蜜桃| 日本在线看片免费| 亚洲精品456在线播放| 中文字幕无线码中文字幕免费| 亚洲无线码在线一区观看| 亚洲AV无码资源在线观看| 国产最新凸凹视频免费| 免费毛片毛片网址| 亚洲综合精品香蕉久久网| 无码天堂亚洲国产AV| 国内精自视频品线六区免费| 国产AV旡码专区亚洲AV苍井空| 宅男666在线永久免费观看| 一级一级一片免费高清| 国产成人亚洲精品青草天美| 日本高清不卡中文字幕免费| a级亚洲片精品久久久久久久| 免费A级毛片无码专区| 亚洲中文字幕久久精品无码VA| 无码欧精品亚洲日韩一区夜夜嗨| 亚洲另类无码专区首页| 亚洲男人av香蕉爽爽爽爽| 91香蕉国产线观看免费全集| 亚洲精品美女久久7777777| 亚洲综合熟女久久久30p|