<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 閱讀(22494) 評論(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  回復  更多評論   

    主站蜘蛛池模板: 久久国产一片免费观看| 亚洲码国产精品高潮在线| 成人免费a级毛片| 3344永久在线观看视频免费首页 | 99热这里只有精品免费播放| 亚洲AV无码成人精品区大在线| 免费无码又爽又刺激高潮视频| 99在线视频免费观看| 中文字幕免费在线观看动作大片 | 精品亚洲一区二区| 亚洲国产精品无码专区在线观看| 亚洲精品夜夜夜妓女网| 国产AV无码专区亚洲AV男同| 亚洲人成人77777网站| 中文字幕亚洲综合久久菠萝蜜| 亚洲精品二区国产综合野狼 | 卡一卡二卡三在线入口免费| 午夜时刻免费入口| 在线a亚洲v天堂网2018| 久久久久亚洲精品天堂久久久久久| 亚洲人成在线播放网站| 亚洲小视频在线观看| 亚洲精品视频在线免费| 亚洲熟妇久久精品| 黄色一级免费网站| 丁香花在线视频观看免费| 99视频有精品视频免费观看| 一二三四在线播放免费观看中文版视频 | 91香蕉国产线在线观看免费| **毛片免费观看久久精品| 毛片免费在线观看网站| 波多野结衣一区二区免费视频| 亚洲精品高清在线| 亚洲国产日韩一区高清在线 | 美腿丝袜亚洲综合| 亚洲国产精品一区二区久久| 国产99在线|亚洲| 一级一级毛片免费播放| 91精品啪在线观看国产线免费| 免费看美女被靠到爽| 中文字幕中韩乱码亚洲大片|