1.什么是規(guī)則引擎?
規(guī)則引擎由推理引擎發(fā)展而來(lái),是一種嵌入在應(yīng)用程序中的組件,實(shí)現(xiàn)了將業(yè)務(wù)決策從應(yīng)用程序代碼中分離出來(lái),并使用預(yù)定義的語(yǔ)義模塊編寫業(yè)務(wù)決策。接受數(shù)據(jù)輸入,解釋業(yè)務(wù)規(guī)則,并根據(jù)業(yè)務(wù)規(guī)則做出業(yè)務(wù)決策。
2.使用規(guī)則引擎的好處。
· 聲明式編程:規(guī)則引擎允許你描述做什么而不是如何去做。
· 邏輯與數(shù)據(jù)分離:數(shù)據(jù)保存在系統(tǒng)對(duì)象中,邏輯保存在規(guī)則中。這根本性的打破了面向?qū)ο笙到y(tǒng)中將數(shù)據(jù)和邏輯耦合起來(lái)的局面。
· 速度及可測(cè)量性:Rete算法、Leaps算法,以及由此衍生出來(lái)的Drools的Rete、Leaps算法,提供了對(duì)系統(tǒng)數(shù)據(jù)對(duì)象非常有效率的匹配。
· 知識(shí)集中化:通過(guò)使用規(guī)則,將建立一個(gè)可執(zhí)行的規(guī)則庫(kù)。這意味著規(guī)則庫(kù)代表著現(xiàn)實(shí)中的業(yè)務(wù)策略的唯一對(duì)應(yīng),理想情況下可讀性高的規(guī)則還可以被當(dāng)作文檔使用。
· 工具集成:例如Eclipse(將來(lái)可能在基于Web的界面上)這樣的工具為規(guī)則的修改與管理、即時(shí)獲得反饋、內(nèi)容驗(yàn)證與修補(bǔ)提供了辦法。審查與調(diào)試工具同樣也可用了。
· 解釋機(jī)制:通過(guò)將規(guī)則引擎的決斷與決斷的原因一起記錄下來(lái),規(guī)則系統(tǒng)提供了很好的“解釋機(jī)制”。
· 易懂的規(guī)則:通過(guò)建立對(duì)象模型以及DSL(域定義語(yǔ)言),你可以用接近自然語(yǔ)言的方式來(lái)編寫規(guī)則。這讓非技術(shù)人員與領(lǐng)域?qū)<铱梢杂盟麄冏约旱倪壿媮?lái)理解規(guī)則(因?yàn)槌绦虻拿詫m已經(jīng)被隱藏起來(lái)了) 。
3.Drools是什么?
Drools是為Java量身定制的基于Charles Forgy的RETE算法的規(guī)則引擎的實(shí)現(xiàn)。具有了OO接口的RETE,使得商業(yè)規(guī)則有了更自然的表達(dá)。
4.Drools基本框架
Drools被分為兩個(gè)主要的部分:編制和運(yùn)行時(shí)。
Drools編制:編制的過(guò)程包括為規(guī)則建立DRL或XML文件,傳入一個(gè)由Antlr 3文法器定義的解析器中。解析器對(duì)文件中規(guī)則文法的正確性進(jìn)行檢查并為descr建立一個(gè)中間結(jié)構(gòu),在AST中的descr代表規(guī)則的描述。AST然后將descr傳入Package Builder中,由其進(jìn)行打包。Package Builder同時(shí)負(fù)責(zé)包括打包中用到的所有代碼產(chǎn)生器和編譯器。Package對(duì)象是自包含并可配置的,它是一個(gè)包含規(guī)則的序列化的對(duì)象。
Drools 運(yùn)行組件:
RuleBase是運(yùn)行時(shí)組件,包含一個(gè)或多個(gè)Package。Package在任何時(shí)候都可以向RuleBase中添加或刪除。
一個(gè)RuleBase可以同時(shí)初始化多個(gè)Working Memory,在其間維護(hù)著一個(gè)弱引用,除非重新進(jìn)行配置。Working Memory包含許多子組件,如Working Memory Event Support(事件支持), Truth Maintenance System(真值維護(hù)系統(tǒng)), Agenda 和 Agenda Event Support(事件支持)。向Working Memory中設(shè)置對(duì)象的工作可能要在建立了一個(gè)或多個(gè)激活的規(guī)則后才結(jié)束。Agenda負(fù)有規(guī)劃激活規(guī)則運(yùn)行的責(zé)任。
注:這兩個(gè)流程看起來(lái)是比較難懂,下面直接結(jié)合一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明。