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

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

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

    隨筆 - 19, 文章 - 93, 評論 - 17, 引用 - 0
    數(shù)據(jù)加載中……

    (三): Drools規(guī)則引擎 (上)

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

    Drools 規(guī)則引擎(上)

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

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

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

    ?
    Figure 1.2 .?Runtime Components

    2.構(gòu)建(Authoring):

    主要有三個類用來完成構(gòu)建過程:DrlParser, XmlParser PackageBuilder。兩個解析器類從傳入的Reader實例產(chǎn)生descr AST模型。PackageBuilder提供了簡便的API,使你可以忽略那兩個類的存在。這兩個簡單的方法是:“addPackageFromDrl”和“addPackageFromXml”,兩個都只要傳入一個Reader實例作為參數(shù)。下面的例子說明了如何從classpath中的xmldrl文件創(chuàng)建一個Package對象。注意:所有傳入同一個PackageBuilder實例的規(guī)則源,都必須是在相同的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包含了多個將被使用的規(guī)則包(packages of rules)。一個RuleBase是可以序列化的,所以它可以被配置到JNDI或其他類似的服務(wù)。通常,第一次使用時,一個RuleBase被創(chuàng)建并緩存。RuleBaseRuleBaseFactory來實例化,默認返回一個ReteOO RuleBase。可以傳入?yún)?shù)來指定采用ReteOOLeaps。然后,用addPackage方法加入Package實例。你可以加入有相同命名空間(namespace)的多個Package

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

    Figure 3.2. RuleBaseFactory

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

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

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

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

    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

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

    <!--[if !supportEmptyParas]-->

    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 類中的靜態(tài)域常量。


    Figure 3.3 RuleBaseConfiguration

    posted on 2006-12-03 09:54 BPM 閱讀(960) 評論(0)  編輯  收藏 所屬分類: 規(guī)則引擎

    主站蜘蛛池模板: 久久国产免费直播| 亚洲综合激情九月婷婷| 伊人久久五月丁香综合中文亚洲| 国产白丝无码免费视频| 久久亚洲精品成人综合| 免费在线看黄的网站| 婷婷精品国产亚洲AV麻豆不片| 日韩电影免费在线观看| 亚洲国产综合专区在线电影| 99热在线观看免费| 亚洲自偷自拍另类图片二区| 1a级毛片免费观看| 亚洲国产人成在线观看| 欧亚精品一区三区免费| 亚洲暴爽av人人爽日日碰| 四虎AV永久在线精品免费观看| 美女羞羞免费视频网站| 亚洲色偷偷狠狠综合网| caoporn国产精品免费| 亚洲国产精品无码久久久不卡| 大地资源中文在线观看免费版| 亚洲美女一区二区三区| 女人被弄到高潮的免费视频| 免费无遮挡无遮羞在线看| 久久亚洲精品无码播放| 久久久久久影院久久久久免费精品国产小说| 亚洲AV人人澡人人爽人人夜夜| 国产乱子精品免费视观看片| 亚洲欧美乱色情图片| 亚洲精品99久久久久中文字幕 | 亚洲精品免费在线| 日韩精品免费电影| 最近的2019免费中文字幕| 亚洲欧洲精品久久| 国产小视频免费观看| 在线看片免费人成视频福利| 亚洲中文字幕AV在天堂| 亚洲国产成人久久综合区| 色猫咪免费人成网站在线观看| AV激情亚洲男人的天堂国语| 亚洲成人激情在线|