




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Drools規(guī)那么引擎規(guī)那么引擎簡(jiǎn)介規(guī)那么語(yǔ)言根底Drools高級(jí)語(yǔ)法局部大綱規(guī)那么引擎簡(jiǎn)介學(xué)習(xí)前的準(zhǔn)備開發(fā)環(huán)境的搭建 在maven工程的pom.xml參加以下依賴 另外,Drools5也提供了eclipse的插件,可以參照網(wǎng)上的資料進(jìn)行安裝。
引入規(guī)那么引擎的背景現(xiàn)狀在目前的很多行業(yè)應(yīng)用中,如銀行、保險(xiǎn)、互聯(lián)網(wǎng)金融等領(lǐng)域,存在著大量的業(yè)務(wù)規(guī)那么,這些業(yè)務(wù)規(guī)那么有如下的特點(diǎn):業(yè)務(wù)規(guī)那么數(shù)量繁多、非常復(fù)雜、且規(guī)那么處于不斷的更新變化中現(xiàn)有系統(tǒng)的很多做法是將業(yè)務(wù)規(guī)那么綁定在程序代碼中。存在的問題當(dāng)業(yè)務(wù)規(guī)那么變更時(shí),對(duì)應(yīng)的代碼也得更改,即使每次小的變更都需要經(jīng)歷開發(fā)、測(cè)試驗(yàn)證上線等過程,變更的本錢比較大。長(zhǎng)時(shí)間系統(tǒng)變得越來越難以維護(hù)。系統(tǒng)僵化,新需求插入困難。新需求上線周期較長(zhǎng)。什么是規(guī)那么引擎規(guī)那么引擎是一種嵌套在應(yīng)用程序中的組件應(yīng)用,它實(shí)現(xiàn)了將業(yè)務(wù)規(guī)那么從應(yīng)用程序代碼中別離出來。規(guī)那么引擎使用特定的語(yǔ)法編寫業(yè)務(wù)規(guī)那么。規(guī)那么引擎可以接受數(shù)據(jù)輸入、解釋業(yè)務(wù)規(guī)那么、并根據(jù)業(yè)務(wù)規(guī)那么做出相應(yīng)的決策。
使用規(guī)那么引擎的好處實(shí)現(xiàn)業(yè)務(wù)邏輯與業(yè)務(wù)規(guī)那么的別離,實(shí)現(xiàn)業(yè)務(wù)規(guī)那么的集中管理可以動(dòng)態(tài)修改業(yè)務(wù)規(guī)那么,從而快速響應(yīng)需求變更使業(yè)務(wù)分析人員也可以參與編輯、維護(hù)系統(tǒng)的業(yè)務(wù)規(guī)那么使用規(guī)那么引擎提供的規(guī)那么編輯工具,使復(fù)雜的業(yè)務(wù)規(guī)那么實(shí)現(xiàn)變得的簡(jiǎn)單Drool5規(guī)那么引擎的工作原理簡(jiǎn)單的說,就是將用戶編寫的規(guī)那么文件(*.drl)通過工具類加載、編譯、打成jar包后,參加到指定的地方〔一般是和規(guī)那么引擎打交道的會(huì)話session〕供規(guī)那么引擎去調(diào)用和執(zhí)行。一個(gè)簡(jiǎn)單的例子一個(gè)簡(jiǎn)單的例子
一個(gè)簡(jiǎn)單的例子運(yùn)行結(jié)果:在Drools當(dāng)中,規(guī)那么的編譯與運(yùn)行要通過Drools提供的各種API來實(shí)現(xiàn)這些API總體來講可以分為三類:規(guī)那么編譯、規(guī)那么收集和規(guī)那么的執(zhí)行主要有KnowledgeBuilder、KnowledgeBase、StatefulKnowledgeSession、StatelessKnowledgeSession等它們起到的作用主要是對(duì)規(guī)那么文件進(jìn)行收集、編譯、查錯(cuò)、插入fact、設(shè)置global、執(zhí)行規(guī)那么或規(guī)那么流等一個(gè)簡(jiǎn)單的例子Drools的API之KnowledgeBuilder的作用用來在業(yè)務(wù)代碼當(dāng)中收集已經(jīng)編寫好的規(guī)那么,然后對(duì)這些規(guī)那么文件進(jìn)行編譯,最終產(chǎn)生一批編譯好的規(guī)那么包〔KnowledgePackage〕給其它的應(yīng)用程序使用。Drools的API之KnowledgeBase的作用用來收集應(yīng)用當(dāng)中知識(shí)(knowledge),在一個(gè)KnowledgeBase當(dāng)中可以包含普通的規(guī)那么〔rule〕、規(guī)那么流(ruleflow)、函數(shù)定義(function)、用戶自定義對(duì)象〔typemodel〕等KnowledgeBase本身不包含任何業(yè)務(wù)數(shù)據(jù)對(duì)象〔fact對(duì)象:JavaBeanset到WorkingMemory后的對(duì)象〕業(yè)務(wù)數(shù)據(jù)對(duì)象〔fact對(duì)象〕都是插入到由KnowledgeBase產(chǎn)生的兩種類型的session對(duì)象當(dāng)中〔StatefulKnowledgeSession和StatelessKnowledgeSession〕一個(gè)簡(jiǎn)單的例子Drools的API之statefulKnowledgeSession作用:規(guī)那么編譯完成之后,編譯好的規(guī)那么包文件在規(guī)那么引擎當(dāng)中運(yùn)行起來,StatefulKnowledgeSession主要作用是對(duì)規(guī)那么引擎進(jìn)行交互。StatefulKnowledgeSession可以接受外部插入〔insert〕的業(yè)務(wù)數(shù)據(jù)——也叫fact使用完StatefulKnowledgeSession對(duì)象之后,一定要調(diào)用其dispose()方法fireAllRules()方法觸發(fā)所有的規(guī)那么執(zhí)行一個(gè)簡(jiǎn)單的例子Fact對(duì)象〔這個(gè)概念很重要,后面會(huì)陸續(xù)出現(xiàn)〕一個(gè)普通的JavaBean插入到規(guī)那么的WorkingMemory當(dāng)中后的對(duì)象。當(dāng)Fact對(duì)象插入到WorkingMemory當(dāng)中后,會(huì)與當(dāng)前WorkingMemory當(dāng)中所有的規(guī)那么進(jìn)行匹配,同時(shí)返回一個(gè)FactHandler對(duì)象。FactHandler對(duì)象是插入到WorkingMemory當(dāng)中Fact對(duì)象的引用句柄。FactHandler對(duì)象可以實(shí)現(xiàn)對(duì)對(duì)應(yīng)的Fact對(duì)象的刪除及修改等操作。規(guī)那么主要是對(duì)fact對(duì)象進(jìn)行操作,fact是規(guī)那么與應(yīng)用系統(tǒng)交換數(shù)據(jù)的橋梁規(guī)那么語(yǔ)言根底規(guī)那么文件一個(gè)標(biāo)準(zhǔn)的規(guī)那么文件就是一個(gè)以“.drl”結(jié)尾的文本文件Packages和java的package差不多Imports和java的import一樣Globals全局變量的聲明Functions函數(shù)的聲明,和javascript的函數(shù)聲明差不多Queries,查詢用Rules,規(guī)那么什么是規(guī)那么一個(gè)規(guī)那么(rule)由規(guī)那么名稱、屬性局部(attributes)、條件局部LHS(lefthandside)和結(jié)果局部LHS(lefthandside)組成當(dāng)所有的LHS(lefthandside)匹配,rule可能“fire”規(guī)那么(rule)操縱應(yīng)用程序中的數(shù)據(jù)(fact)
Rule格式條件局部LHS可以包含0~n個(gè)條件條件局部為空,引擎會(huì)自動(dòng)添加一個(gè)eval(true),該條件返回為true,如:條件又稱之為pattern(匹配模式),多個(gè)pattern之間用可以用and或or連接Pattern(匹配模式)語(yǔ)法如下:
$customer是綁定變量名,age>30是約束條件,其中變量[綁定變量名:]和[field約束]都是可以省略的。約束條件采用“&&”(and)、”||”(or)、和”,”(and)來實(shí)現(xiàn)對(duì)象內(nèi)部多個(gè)約束在沒有用小括號(hào)的情況下,優(yōu)先級(jí)是:“&&”(and)、”||”(or)、和”,”(and),如下:符合條件的Customer對(duì)象,要么是age>20的,要么是gender==‘male’且city=‘sh’的
”,”不能與“&&”和”||”混合使用。比較操作符Drools5提供了12種類型的比較操作符,分別是:>、>=、<、<=、==、!=、contains、notcontains、memberof、notmemberof、matches、notmatches前6種使用比較多,后面的幾種的使用,簡(jiǎn)單介紹下。比較操作符(contains和notcontains)contains是用來檢查一個(gè)Fact對(duì)象的某個(gè)字段〔該字段要是一個(gè)Collection或是一個(gè)Array類型的對(duì)象〕是否包含一個(gè)指定的對(duì)象。格式:
notcontains正好和contains的功能相反。比較操作符(memberof和notmemberof)memberOf是用來判斷某個(gè)Fact對(duì)象的某個(gè)字段是否在一個(gè)集合(Collection/Array)當(dāng)中。格式:.notmemberof的功能正好和memberof的相反比較操作符(matches和notmatches)matches是用來對(duì)某個(gè)Fact的字段與標(biāo)準(zhǔn)的Java正那么表達(dá)式進(jìn)行相似匹配。格式:notmatches正好和maches的功能相反。結(jié)果局部(RHS)只有在LHS的所有條件都滿足時(shí)RHS局部才會(huì)執(zhí)行.在RHS當(dāng)中可以使用LHS定義的綁定變量名,設(shè)置的全局變量、或者是直接編寫Java代碼。RHS雖然可以直接編寫Java代碼,但不建議在代碼當(dāng)中有條件判斷,如果需要條件判斷,請(qǐng)重新考慮將其放在LHS當(dāng)中,否那么就違背了使用規(guī)那么的初衷。在RHS里面,提供了一些對(duì)當(dāng)前WorkingMemory實(shí)現(xiàn)快速操作的宏宏函數(shù)或?qū)ο蟊确絠nsert/insertLogical、update和retract就可以實(shí)現(xiàn)對(duì)當(dāng)前WorkingMemory中的Fact對(duì)象進(jìn)行新增、刪除或者是修改。Drools還提供了一個(gè)名為kcontext的宏對(duì)象。Kcontext的宏對(duì)象直接訪問當(dāng)前WorkingMemory的KnowledgeRuntimeInsert宏函數(shù)Java類中StatefulKnowledgeSession對(duì)象的insert方法的作用相同。都是用來將一個(gè)Fact對(duì)象插入到當(dāng)前的WorkingMemory當(dāng)中根本格式:注意:一旦調(diào)用insert宏函數(shù),那么Drools會(huì)重新與所有的規(guī)那么再重新匹配一次,對(duì)于沒有設(shè)置no-loop=true的規(guī)那么,如果條件滿足,不管其之前是否執(zhí)行過都會(huì)再執(zhí)行一次。update、retract宏函數(shù)同樣具有該特性??梢赃@么理解,在調(diào)用insert、update、retract宏函數(shù)時(shí),會(huì)自動(dòng)的用fireAllRules()方法觸發(fā)所有的規(guī)那么執(zhí)行。使用實(shí)例如右圖:Update宏函數(shù)用來實(shí)現(xiàn)對(duì)當(dāng)前WorkingMemory當(dāng)中的Fact進(jìn)行更新。
有兩種用法形式(1)直接更新一個(gè)Fact對(duì)象,格式:(2)通過指定FactHandle來更新對(duì)應(yīng)的Fact對(duì)象。
Update宏函數(shù)FactHandle來更新對(duì)應(yīng)的Fact對(duì)象實(shí)例:retract宏函數(shù)用來將WorkingMemory當(dāng)中某個(gè)Fact對(duì)象從WorkingMemory當(dāng)中刪除。
使用格式:restact(newObject())
drools宏對(duì)象Drools宏對(duì)象可以用來實(shí)現(xiàn)對(duì)當(dāng)前的WorkingMemory控制。Modify表達(dá)式Modify表達(dá)式可以快速實(shí)現(xiàn)對(duì)Fact對(duì)象多個(gè)屬性進(jìn)行修改,修改完成后會(huì)自動(dòng)更新到當(dāng)前的WorkingMemory當(dāng)中。格式:實(shí)例如:注意:一旦調(diào)用modify表達(dá)式,那么Drools會(huì)重新與所有的規(guī)那么再重新匹配一次,對(duì)于沒有設(shè)置no-loop=true的規(guī)那么,如果條件滿足,不管其之前是否執(zhí)行過都會(huì)再執(zhí)行一次。
insert、update、retract、modify需要注意的地方〔1〕它們都能使WorkingMemery里的fact對(duì)象發(fā)生變化?!?〕都會(huì)自動(dòng)調(diào)用fireAllRules()方法,自動(dòng)觸發(fā)規(guī)那么的執(zhí)行?!?〕觸發(fā)規(guī)那么時(shí),假設(shè)no-loop=true,新改變的fact對(duì)象,會(huì)對(duì)非自身的其它的所有規(guī)那么重新匹配一次?!?〕觸發(fā)規(guī)那么時(shí),假設(shè)no-loop=false,新改變的fact對(duì)象,會(huì)對(duì)所有規(guī)那么〔包括自身〕重新匹配一次?!?〕觸發(fā)規(guī)那么時(shí),匹配的原那么是:新改變的fact對(duì)象只去匹配條件包涵有fact對(duì)象的規(guī)那么表達(dá)式?!?〕no-loop屬性,只是針對(duì)自身觸發(fā)的規(guī)那么有用。注意用好此屬性,防止死循環(huán)屬性局部Drools5中,規(guī)那么的屬性共有13個(gè),它們分別是:activation-group、agenda-group、auto-focus、date-effective、date-expires、dialect、duration、enabled、lock-on-active、no-loop、ruleflow-group、salience、when下面介紹幾個(gè)常用的比較重要的屬性salience,它的作用是用來設(shè)置規(guī)那么執(zhí)行的優(yōu)先級(jí),默認(rèn)是0,數(shù)字越大執(zhí)行優(yōu)先級(jí)越高,值也可以是負(fù)數(shù)。no-loop,它的作用是用來控制已經(jīng)執(zhí)行過的規(guī)那么在條件再次滿足時(shí)是否再次執(zhí)行。enabled,表示規(guī)那么是否可用,默認(rèn)為true,值為false,表示該條規(guī)那么不可用。dialect,用來定義規(guī)那么當(dāng)中要使用的語(yǔ)言類型,Drools5目前支持兩種方言,分別是mvel和java,默認(rèn)值為java屬性局部(activation-group)該屬性的作用是將假設(shè)干個(gè)規(guī)那么劃分成一個(gè)組,用一個(gè)字符串來給這個(gè)組命名,這樣在執(zhí)行的時(shí)候,具有相同activation-group屬性的規(guī)那么中只要有一個(gè)會(huì)被執(zhí)行,其它的規(guī)那么都將不再執(zhí)行。該屬性的特點(diǎn):規(guī)那么進(jìn)行分組,同組成員互斥,只有一個(gè)規(guī)那么能執(zhí)行成功。同組成員規(guī)那么的執(zhí)行順序,非常像if…elseif…elseif……的結(jié)構(gòu)使用該規(guī)那么,有一點(diǎn)要特別注意:每個(gè)執(zhí)行成功的規(guī)那么,只能成功的匹配一次屬性局部(agenda-group)這個(gè)屬性非常重要此屬性的作用也是對(duì)規(guī)那么進(jìn)行分組,擁有該屬性組的規(guī)那么,需要用戶手動(dòng)激活才能執(zhí)行該組的所有規(guī)那么。該屬性的特點(diǎn)是:規(guī)那么分組,手動(dòng)激活,按優(yōu)先級(jí)順序執(zhí)行所有規(guī)那么。屬性局部(lock-on-active)這個(gè)屬性也非常重要當(dāng)規(guī)那么使用*-group組屬性時(shí),如agenda-group、activation-group,在lock-on-action設(shè)置為true,可以防止因某些Fact對(duì)象被修改而導(dǎo)致已經(jīng)執(zhí)行過的規(guī)那么再次被激活執(zhí)行。此屬性的特點(diǎn):只能配合*-group組屬性一起使用,是no-loop屬性的升級(jí)版,只不過,no-loop屬性管理著單個(gè)規(guī)那么,而lock-on-active管理著規(guī)那么組。注釋在Drools當(dāng)中注釋的寫法與編寫Java類的注釋的寫法完全相同,寫法分兩種:?jiǎn)涡凶⑨屌c多行注釋單行注釋,采用“#”或者“//”來進(jìn)行標(biāo)記,如下:多行注釋,和Java語(yǔ)法完全一樣,
以“/*”開始,以“*/”結(jié)束,如右圖:函數(shù)Drools函數(shù)和javascript方法幾乎一樣,以function標(biāo)記開頭,如下:
可以在規(guī)那么文件的任何位置定義函數(shù),和javascript不同的是,函數(shù)體是用java代碼書寫的。如下:函數(shù)的作用域只不過,規(guī)那么文件里定義的函數(shù),作用域只能在本規(guī)那么文件內(nèi)有效,超出該規(guī)那么范圍,就不能生效了。為了解決這一問題,通常在實(shí)際應(yīng)用中,使用java的靜態(tài)方法,drools提供了一個(gè)特殊的import語(yǔ)句:importfunction;如下:查詢?cè)贒rools當(dāng)中查詢以query關(guān)鍵字開始,以end關(guān)鍵字結(jié)束主要作用是對(duì)WorkingMemery里的fact對(duì)象進(jìn)行統(tǒng)計(jì)及查詢。無(wú)參查詢格式:實(shí)例如右圖:有參查詢格式:
實(shí)例如右圖:
Drools高級(jí)語(yǔ)法局部Agenda〔議程〕什么是議程當(dāng)一個(gè)規(guī)那么完全被匹配,一個(gè)Activation(活動(dòng))被創(chuàng)立,引用的規(guī)那么和匹配的事實(shí),被放置到議程中議程就是通過使用沖突解決策略控制這些活動(dòng)的執(zhí)行順序沖突解決方案SalienceAgendaGroupActivationGroupRuleFlowGroup工作空間動(dòng)作議程計(jì)算AgendaFilters〔議程過濾器〕運(yùn)行或者阻止活動(dòng)的引發(fā)Drools提供了一些開箱即用的過濾器也可以自定義過濾器,需實(shí)現(xiàn)AgendaFi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)用工勞動(dòng)合同
- 2025年婁底考貨運(yùn)從業(yè)資格證
- 2025年隴南貨運(yùn)從業(yè)資格仿真考題
- 2025年揭陽(yáng)貨運(yùn)從業(yè)資格證考試內(nèi)容
- 2023年全國(guó)乙卷高考真題生物試卷解析
- 高壓水流清洗機(jī)產(chǎn)業(yè)分析報(bào)告
- 煙草、鹽加工機(jī)械市場(chǎng)分析及競(jìng)爭(zhēng)策略分析報(bào)告
- 浸漬、涂布或包覆處理紡織物競(jìng)爭(zhēng)策略分析報(bào)告
- 《天然藥物化學(xué)成分提取與分離》課程標(biāo)準(zhǔn)
- 上海市裝修設(shè)計(jì)合同范本
- 文化差異下的教育國(guó)外的小學(xué)音樂教育方式探討
- 2025年無(wú)錫科技職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 2024年黑龍江建筑職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 七年級(jí)語(yǔ)文上冊(cè)課后習(xí)題參考答案
- 第四單元《紙的前世今生》第一課時(shí)(說課稿)-2023-2024學(xué)年五年級(jí)下冊(cè)綜合實(shí)踐活動(dòng)粵教版
- 四川省綿陽(yáng)市2025屆高三第二次診斷性考試英語(yǔ)試題(含答案無(wú)聽力原文及音頻)
- 醫(yī)學(xué)實(shí)驗(yàn)室風(fēng)險(xiǎn)評(píng)估報(bào)告-臨床實(shí)驗(yàn)室風(fēng)險(xiǎn)評(píng)估-可復(fù)制
- 八大員-勞務(wù)員??荚囶}與答案
- 2024危重癥患兒管飼喂養(yǎng)護(hù)理-中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)課件
- 脫硫自動(dòng)化控制-洞察分析
- 醫(yī)務(wù)人員醫(yī)德醫(yī)風(fēng)培訓(xùn)
評(píng)論
0/150
提交評(píng)論