資源描述:
《drools研究 drools學(xué)習(xí)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)。
1、Drools的進(jìn)一步研究——徐建軍2006-09-241.概述12.規(guī)則表示22.1.Package22.2.Rule42.2.1.規(guī)則屬性52.2.2.LHS62.2.3.RHS82.3.Query92.4.DSL102.5.XML112.6.決策表133.規(guī)則編譯154.Rete算法184.1.Rete網(wǎng)絡(luò)的構(gòu)成184.2.基于Rete網(wǎng)絡(luò)的前向推理過(guò)程245.Leaps算法245.1.Leaps推理機(jī)的構(gòu)造過(guò)程265.2.事實(shí)對(duì)象的操作過(guò)程315.2.1.事實(shí)對(duì)象的斷言過(guò)程315.2.2.事實(shí)對(duì)象的收回過(guò)程325.2.3.事實(shí)對(duì)
2、象的修改過(guò)程335.3.基于Leaps推理機(jī)的前向推理過(guò)程335.4.Droosl3的Leaps算法的說(shuō)明376.RuleBase387.WoringMemory398.Agenda439.Drools的下一步發(fā)展4510.結(jié)論461.概述在介紹規(guī)則系統(tǒng)的文章中,經(jīng)常提到的一句話(huà)是:任何事物都會(huì)改變,唯一不變的是變化。Drools同樣也不例外。目前Drools已經(jīng)從Codehaus中獨(dú)立出來(lái),轉(zhuǎn)投JBoss這座靠山,目前最新發(fā)布版本是3.0.4。目前名稱(chēng)叫JBossRules,但為了描述方便,這里仍稱(chēng)為Drools。Drools3與前
3、面分析的2.5版本比較在很多方面都發(fā)生了改變。圖1描述了目前Drools規(guī)則引擎的構(gòu)成。圖1Drools規(guī)則引擎的構(gòu)成從圖上可以發(fā)現(xiàn)最顯著的變化是引擎的模式匹配(PatternMatcher)算法除了實(shí)現(xiàn)了Rete算法,還實(shí)現(xiàn)了Leaps算法。但是其它模塊在具體細(xì)節(jié)上也有改變或者改進(jìn)。本文主要針對(duì)Drools2.5版本,介紹Drools3新的實(shí)現(xiàn)方法和機(jī)制。并且只對(duì)這些變化較大的部分進(jìn)行介紹,而忽略了相同的或者有細(xì)微改變但實(shí)現(xiàn)原理相通的地方。理解不清的部分可以參照以前的分析文檔。本文首先介紹了Drools3中一個(gè)主要變化:Drools
4、獨(dú)立的規(guī)則定義語(yǔ)言,其中還包括DSl和決策表。然后介紹Drools3的規(guī)則編譯過(guò)程。重點(diǎn)分析Drools3中的兩種推理算法——Rete算法和Leaps算法,對(duì)于Rete算法只介紹了Drools3和Drools2.5實(shí)現(xiàn)的不同之處,由于Leaps算法是Drools3新引進(jìn)的算法,所以對(duì)它進(jìn)行了詳細(xì)分析。最后分幾小節(jié)介紹Drools3在RuleBase、WorkingMemory和Agenda三個(gè)部分所進(jìn)行的主要改進(jìn),最后給出結(jié)論。1.規(guī)則表示Drools3與Drools2.5相比較,很重要的改變就是規(guī)則的表示從XML格式轉(zhuǎn)變?yōu)槲谋靖袷剑?/p>
5、使用了一套自己的規(guī)則描述語(yǔ)言。這種語(yǔ)言的格式非常簡(jiǎn)單易懂,便于規(guī)則的創(chuàng)建和維護(hù),而且可以通過(guò)DSL(DomainSpecificLanguages)的形式進(jìn)行擴(kuò)展。規(guī)則定義文件仍然以“drl”為后綴,同時(shí)Drools3仍然支持XML格式的規(guī)則定義方式。為了方便對(duì)業(yè)務(wù)規(guī)則的定義、維護(hù)和分析,Drools3還實(shí)現(xiàn)了決策表功能。1.1.Packagepackage表示一系列規(guī)則的集合,是定義和管理規(guī)則的基本單位,對(duì)應(yīng)到Drools2.5中的RuleSet。與Java的package不同,這里package的名稱(chēng)只有名字空間的作用,與文件和目
6、錄結(jié)構(gòu)無(wú)關(guān)。package的主要內(nèi)容由import、expander、global、function、query和rule部分構(gòu)成。結(jié)構(gòu)見(jiàn)圖2。下面主要介紹import、expander、global和function四個(gè)部分,query和rule在后續(xù)小節(jié)中介紹。圖2package的語(yǔ)法結(jié)構(gòu)這里的import語(yǔ)句與Java中的import語(yǔ)句功能相同。把規(guī)則需要引用的Java對(duì)象類(lèi)名德全路徑寫(xiě)在“import”之后,規(guī)則引擎運(yùn)行時(shí)會(huì)自動(dòng)裝載相應(yīng)類(lèi)。示例如下:importorg.drools.examples.FibonacciExa
7、mple.Fibonacci;expander語(yǔ)句用于表示擴(kuò)展規(guī)則定義所需的DSL文件,這些DSL文件解釋了規(guī)則體中針對(duì)特定問(wèn)題領(lǐng)域的方便用戶(hù)理解的組成元素。示例如下:expanderticketing.dsl;global語(yǔ)句表示多個(gè)規(guī)則用到的全局變量,常用于表示規(guī)則使用的數(shù)據(jù),對(duì)應(yīng)于Drools2.5中的application-data屬性。如果多個(gè)包同時(shí)定義同一名稱(chēng)的全局變量,那這些變量必須是同一類(lèi)型,實(shí)際執(zhí)行時(shí)它們都指向同一變量。由于全局變量并不會(huì)斷言到WorkingMemory中,引擎并不知道變量值是否發(fā)生了改變,所以全局變
8、量一般不能用在規(guī)則的條件限制語(yǔ)句(constraints)中,除非明確知道global變量值不會(huì)發(fā)生改變。示例如下:globaljava.lang.Integeri;function表達(dá)式用于定義規(guī)則體經(jīng)常使用的業(yè)務(wù)邏輯