<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

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    我關(guān)注的Blog

    最新評(píng)論

    JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上)

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

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

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

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

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

    ?
    Figure 1.2 .?Runtime Components

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

    主要有三個(gè)類(lèi)用來(lái)完成構(gòu)建過(guò)程:DrlParser, XmlParser PackageBuilder。兩個(gè)解析器類(lèi)從傳入的Reader實(shí)例產(chǎn)生descr AST模型。PackageBuilder提供了簡(jiǎn)便的API,使你可以忽略那兩個(gè)類(lèi)的存在。這兩個(gè)簡(jiǎn)單的方法是:“addPackageFromDrl”和“addPackageFromXml”,兩個(gè)都只要傳入一個(gè)Reader實(shí)例作為參數(shù)。下面的例子說(shuō)明了如何從classpath中的xmldrl文件創(chuàng)建一個(gè)Package對(duì)象。注意:所有傳入同一個(gè)PackageBuilder實(shí)例的規(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。通常,你可以指定另一個(gè)parent ClassLoader和用什么編譯器(compiler),默認(rèn)是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

    一個(gè)RuleBase包含了多個(gè)將被使用的規(guī)則包(packages of rules)。一個(gè)RuleBase是可以序列化的,所以它可以被配置到JNDI或其他類(lèi)似的服務(wù)。通常,第一次使用時(shí),一個(gè)RuleBase被創(chuàng)建并緩存。RuleBaseRuleBaseFactory來(lái)實(shí)例化,默認(rèn)返回一個(gè)ReteOO RuleBase。可以傳入?yún)?shù)來(lái)指定采用ReteOOLeaps。然后,用addPackage方法加入Package實(shí)例。你可以加入有相同命名空間(namespace)的多個(gè)Package

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

    Figure 3.2. RuleBaseFactory

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

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

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

    任何時(shí)候, Package 可以被加入或移除;所有的改變都會(huì)被反映到現(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

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

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

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

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

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

    兩個(gè)主要的屬性是: PROPERT_ASSERT_BEHAVIOR PROPERTY_LOGICAL_OVERRIDE_BEHAVIOR (在以后的部分中會(huì)解釋?zhuān)K械膶傩灾刀际?/span> RuleBaseConfiguration 類(lèi)中的靜態(tài)域常量。


    Figure 3.3 RuleBaseConfiguration



    posted on 2006-06-04 12:50 guangnian 閱讀(22494) 評(píng)論(14)  編輯  收藏 所屬分類(lèi): JBoss Rules(Drools)

    評(píng)論

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上) 2006-06-08 00:02 steeven

    好文,謝謝~

    偶一直在想什么場(chǎng)合下需要rule engine.
    1. 如果邏輯在開(kāi)發(fā)前就定好,雖然比較復(fù)雜,如果用rule engine,碰到重構(gòu),rule要手工操作。而且規(guī)則語(yǔ)法的錯(cuò)誤不容易檢查出來(lái)。
    2. 如果要客戶(hù)來(lái)寫(xiě)規(guī)則,讓客戶(hù)學(xué)習(xí)語(yǔ)法規(guī)則還是用界面生成呢?
      回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上) 2006-06-08 15:00 guangnian

    @steeven
    我想rule engine主要用在規(guī)則經(jīng)常變化的情況在,此時(shí)只需要改動(dòng)drl文件,而不需要改代碼。對(duì)于規(guī)則語(yǔ)法錯(cuò)誤可以靠IDE工具來(lái)寫(xiě)規(guī)則啊,JBoss已經(jīng)有提供Eclipse plugin了。
    規(guī)則當(dāng)然是程序員根據(jù)客戶(hù)的需求來(lái)寫(xiě)的啊  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上) 2006-11-22 18:09 syyhpf

    那測(cè)試呢?修改完規(guī)則后怎樣測(cè)試?在運(yùn)行系統(tǒng)中?  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上) 2006-11-30 14:55 coolfish

    應(yīng)該有專(zhuān)門(mén)的測(cè)試環(huán)境吧  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上) 2007-07-04 13:30 liujg

    所有傳入同一個(gè)PackageBuilder實(shí)例的規(guī)則源,都必須是在相同的package 命名空間(namespace)中.請(qǐng)問(wèn)這里的package的命名空間是什么呢?  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上) 2007-07-04 13:38 liujg

    看來(lái)今年沒(méi)有人關(guān)注該貼了!郁悶......  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上)[未登錄](méi) 2007-08-23 12:48 dd

    好文章啊,要是能給個(gè)具體的操作就好了..舉個(gè)例子就好了.我看的很迷糊  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上)[未登錄](méi) 2007-08-27 09:29 sclsch

    mark  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上) 2007-11-24 15:32 myim

    我給個(gè)例子:
    電梯行業(yè),

    如果樓層高是10層
    那么控制板上的按鈕就是10+5(其它功能)個(gè)
    如果載重1000公斤
    那么就選擇A型號(hào)的電機(jī)
    如果是前后開(kāi)門(mén)
    那么加工路線(xiàn)就是R
    如果門(mén)是對(duì)開(kāi)
    那么就選擇Item Number D作為這個(gè)合同的門(mén)類(lèi)型來(lái)加工
    如果客戶(hù)要噴涂藍(lán)色的門(mén)
    那么就選擇噴涂加工路線(xiàn),
    并且噴涂顏料選擇Item Number Blue
    。。。。

    類(lèi)似的Rule可以達(dá)到幾萬(wàn)條以上,不知道這個(gè)企業(yè)作用是否適合選擇DRools來(lái)做,真實(shí)地ERP中也使用Rule來(lái)做的。

    請(qǐng)問(wèn)DRools在這樣的場(chǎng)景中是否物有所值?還是說(shuō)DRools用在這樣的地方,大材小用了,他有更高級(jí)的用處?

    剛剛發(fā)現(xiàn)DRools, 非常有興趣研究
      回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上) 2008-01-18 14:16 ePim

    路過(guò),今天開(kāi)始接觸這個(gè)東本,好難入門(mén)啊~~  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上) 2009-02-10 15:16 hc

    這個(gè)版本低了 很多屬性字段都不適用了   回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上) 2010-02-03 17:30 ddoo

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

    這上面有更詳細(xì)的文檔.  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上)[未登錄](méi) 2011-03-05 23:01 xiaogang

    請(qǐng)問(wèn)文中所說(shuō)的 descr AST中間結(jié)構(gòu)是一種什么樣的結(jié)構(gòu)啊?在網(wǎng)上搜不到相關(guān)資料,謝謝  回復(fù)  更多評(píng)論   

    # re: JBoss Rules 學(xué)習(xí)(三): Drools規(guī)則引擎 (上)[未登錄](méi) 2014-03-21 14:19 Lee

    也就是說(shuō)我可以用antlr把自己的規(guī)則語(yǔ)法映射到drools可是別的程度 so good  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 亚洲精品在线视频观看| 亚洲无码黄色网址| 99久久综合国产精品免费| 青青草无码免费一二三区| 无码人妻AV免费一区二区三区| 中文字幕无码日韩专区免费 | 亚洲热线99精品视频| 亚洲午夜久久久影院伊人| 国产亚洲色婷婷久久99精品| 国产亚洲一区二区手机在线观看| 久久亚洲国产精品| 久久丫精品国产亚洲av| 亚洲毛片基地日韩毛片基地| 亚洲a级成人片在线观看| 亚洲欧洲日产国码久在线| 看成年女人免费午夜视频| 一级一看免费完整版毛片| 99麻豆久久久国产精品免费| 午夜网站在线观看免费完整高清观看 | 亚洲国产成人久久综合碰碰动漫3d | 国产成人免费片在线观看| 亚洲成a人片在线观看老师| 亚洲热妇无码AV在线播放| 亚洲2022国产成人精品无码区| 亚洲日产2021三区在线| 亚洲欧洲无卡二区视頻| 草久免费在线观看网站| 日韩a级无码免费视频| h在线观看视频免费网站| 夜夜爽免费888视频| 亚洲成?v人片天堂网无码| 亚洲αv久久久噜噜噜噜噜| 亚洲高清中文字幕| 激情无码亚洲一区二区三区| 国产99精品一区二区三区免费| 香蕉免费一区二区三区| 日韩免费高清视频| 亚洲国产无套无码av电影| 亚洲AV无码国产精品色| 理论秋霞在线看免费| 无码人妻久久一区二区三区免费 |