




已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1.Drools 規(guī)則引擎基本介紹1.1Drools 基本介紹Drools是用Java語言編寫的開放源碼的規(guī)則引擎。Drools使用RETE算法對規(guī)則進(jìn)行求值,在Drools6.0(當(dāng)前最新版本)中還引進(jìn)了PHREAK算法,Drools 允許使用聲明方式表達(dá)業(yè)務(wù)邏輯??梢允褂梅?XML 的本地語言編寫規(guī)則,從而便于學(xué)習(xí)和理解。并且,還可以將 Java 代碼直接嵌入到規(guī)則文件中,這令 Drools 的學(xué)習(xí)更加吸引人。1.2那什么是規(guī)則引擎呢? 規(guī)則引擎由推理引擎發(fā)展而來,是一種嵌入在應(yīng)用程序中的組件,實(shí)現(xiàn)了將業(yè)務(wù)決策從應(yīng)用程序代碼中分離出來,并使用預(yù)定義的語義模塊編寫業(yè)務(wù)決策。接受數(shù)據(jù)輸入,解釋業(yè)務(wù)規(guī)則,并根據(jù)業(yè)務(wù)規(guī)則做出業(yè)務(wù)決策。1.3規(guī)則引擎的應(yīng)用1.4Drools新特性Drools推出了一套新的基于KIE概念的API,其目的是將之前版本中對規(guī)則引擎繁瑣的調(diào)用和加載過程加以簡化。Drools6給我的最大不同就是把rules打包成jar,使用端通過kie-ci來動態(tài)從maven repo中獲取指定rules jar版本,雖然和maven有緊耦合,簡化以及清晰了rules的使用和動態(tài)升級:系統(tǒng)建立2個項(xiàng)目:一個Drools項(xiàng)目來實(shí)現(xiàn)規(guī)則,驗(yàn)收規(guī)則,生成jar包,另外一個就是真正要用規(guī)則的項(xiàng)目,直接通過引入不同版本的jar包實(shí)習(xí)規(guī)則動態(tài)升級。2.Drools 適用2.1應(yīng)用場景:為提高效率,管理流程必須自動化,即使現(xiàn)代商業(yè)規(guī)則異常復(fù)雜。市場要求業(yè)務(wù)規(guī)則經(jīng)常變化,系統(tǒng)必須依據(jù)業(yè)務(wù)規(guī)則的變化快速、低成本的更新。為了快速、低成本的更新,業(yè)務(wù)人員應(yīng)能直接管系統(tǒng)中的規(guī)則,不需要程序開發(fā)人員參與。2.2作用與優(yōu)點(diǎn):將業(yè)務(wù)規(guī)則與業(yè)務(wù)系統(tǒng)分離,解耦合;實(shí)現(xiàn)自然語言描述規(guī)則邏輯,業(yè)務(wù)人員易于理解;可視化的規(guī)則定制、審批、查詢及管理;能有效的提高實(shí)現(xiàn)復(fù)雜邏輯的代碼的可維護(hù)性;應(yīng)付特殊狀況,即客戶一開始沒有提到要將業(yè)務(wù)邏輯考慮在內(nèi);符合組織對敏捷或迭代開發(fā)過程的使用;2.3 適用的系統(tǒng)企業(yè)應(yīng)用的ERP、CRM以及電子商務(wù)的銷售系統(tǒng)及營銷系統(tǒng)等3.Drools 實(shí)例介紹3.1Drools編譯與運(yùn)行在Drools當(dāng)中,規(guī)則的編譯與運(yùn)行要通過Drools提供的各種API來實(shí)現(xiàn),這些API總體來講可以分為三類:規(guī)則編譯、規(guī)則收集和規(guī)則的執(zhí)行。在Drools當(dāng)中,規(guī)則的編譯與運(yùn)行要通過Drools提供的各種API來實(shí)現(xiàn),這些API總體來講可以分為三類:規(guī)則編譯、規(guī)則收集和規(guī)則的執(zhí)行。3.2Kmodule.xmlkmodule.xml文件存放在src/main/resources/META-INF/文件夾下。代碼這個kmodule.xml的文件的定義非常簡單,其實(shí)也很容易理解:一個kmodule里面包含了兩個kbase,這個也是我們這個例子里面的兩個用例,分別對應(yīng)drl規(guī)則文件的例子,一個是對應(yīng)Excel表格的規(guī)則例子。每一個kbase都有一個name,可以取任意字符串,但是不能重名。然后都有一個packages,可以看到packages里面的字符串其實(shí)就是src/main/resources下面的文件夾的名稱,或者叫包名,規(guī)則引擎會根據(jù)這里定義的包來查找規(guī)則定義文件。可以同時定義多個包,以逗號分隔開來就行。每一個kbase下面可以包含多個ksession,當(dāng)然本例中都自定義了一個。每一個ksession都有一個name,名字也可以是任意字符串,但是也不能重復(fù)。kbase和ksession里面的name屬性是全局不能重復(fù)的。kbase和ksession中其實(shí)還有很多其它的屬性,但是在這里不是很重要,就先不提了,后面我們會一一講解的。這樣一個kmodule.xml文件就建立好了。在運(yùn)行時,KieContainer會根據(jù)*Model對象來創(chuàng)建KieModule、KieBase、KieSession對象。其中KieModule和KieBase只會創(chuàng)建一次,而KieSession則有可能創(chuàng)建多次,因?yàn)镵ieSession的創(chuàng)建成本很低,同時KieSession包含了運(yùn)行時的數(shù)據(jù),所以可以銷毀、創(chuàng)建若干次。3.3Drools運(yùn)行測試KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession(ksession-rules); / go ! Message message = new Message(); message.setMessage(Hello World); message.setStatus(Message.HELLO); kSession.insert(message); kSession.fireAllRules();kie框架先初始化一個kieservice對象,從classpath中讀取kmodule,創(chuàng)建KieContainder容器,利用kieContainer對象創(chuàng)建一個新的KieSession,創(chuàng)建session的時候我們傳入了一個name:“ksession-rules”,這個字符串很眼熟吧,這個就是我們定義的kmodule.xml文件中定義的ksession的name。kieContainer根據(jù)kmodule.xml定義的ksession的名稱找到KieSession的定義,然后創(chuàng)建一個KieSession的實(shí)例。KieSession就是一個到規(guī)則引擎的鏈接,通過它就可以跟規(guī)則引擎通訊,并且發(fā)起執(zhí)行規(guī)則的操作。通過kSession.insert方法來將事實(shí)(Fact)插入到引擎中,也就是Working Memory中。然后通過kSession.fireAllRules方法來通知規(guī)則引擎執(zhí)行規(guī)則。3.4Drools語法package com.yeepay.ytf.server.user.service /對一個規(guī)則文件而言,package是必須定義的,必須放在規(guī)則文件第一行。 /特別的是,package的名字是隨意的,不必必須對應(yīng)物理路徑,跟java的package的概念不同,這里只是邏輯上的一種區(qū)分。 /同樣的package下定義的function和query等可以直接使用。 import com.yeepay.ytf.server.user.bean.User; import com.yeepay.ytf.server.user.bean.Response; import java.io.Console; import java.util.Scanner; import com.yeepay.ytf.server.user.service.impl.UserServiceImpl /導(dǎo)入規(guī)則文件需要使用到的外部變量,這里的使用方法跟java相同,但是不同于java的是,這里的import導(dǎo)入的不僅僅可以是一個類,也可以是這個類中的某一個可訪問的靜態(tài)方法。 rule userLogin /定義一個規(guī)則。rule ruleName。一個規(guī)則可以包含三個部分: /屬性部分:定義當(dāng)前規(guī)則執(zhí)行的一些屬性等,比如是否可被重復(fù)執(zhí)行、過期時間、生效時間等。 /條件部分,即LHS,定義當(dāng)前規(guī)則的條件,如 when Message(); 判斷當(dāng)前workingMemory中是否存在Message對象。 /結(jié)果部分,即RHS,這里可以寫普通java代碼,即當(dāng)前規(guī)則條件滿足后執(zhí)行的操作,可以直接調(diào)用Fact對象的方法來操作應(yīng)用。 salience 100 / no-loop : 定義當(dāng)前的規(guī)則是否不允許多次循環(huán)執(zhí)行,默認(rèn)是false / lock-on-active true:通過這個標(biāo)簽,可以控制當(dāng)前的規(guī)則只會被執(zhí)行一次 / date-expires:設(shè)置規(guī)則的過期時間,默認(rèn)的時間格式:“日-月-年” date-expires 2011-01-31 23:59:59 / date-effective:設(shè)置規(guī)則的生效時間,時間格式同上 / duration:規(guī)則定時,duration 3000 3秒后執(zhí)行規(guī)則 / salience:優(yōu)先級,數(shù)值越大越先執(zhí)行,這個可以控制規(guī)則的執(zhí)行順序 when $user:User(phone=null|phone=)& (passwd=null|passwd=) ) / $user:User(phone=null|phone=), (passwd=null|passwd=) ) / 類型比較操作符 = = = != contains / not contains / memberOf / not memberOf /matches/ not matches then Response.setCode(00); Response.setMesg(請輸入用戶名,密碼); / 可以調(diào)用Fact的方法,比如 $message.execute();操作數(shù)據(jù)庫等等一切操作 / insert:往當(dāng)前workingMemory中插入一個新的Fact對象,會觸發(fā)規(guī)則的再次執(zhí)行,除非使用no-loop限定; / update:更新。modify:修改,與update語法不同,結(jié)果都是更新操作。retract:刪除。 End3.5Drools 決策表(Excel)3.5.1 決策表的適用 何時使用決策表如果規(guī)則能夠被表達(dá)為模板+數(shù)據(jù)的格式,那你應(yīng)該考慮使用決策表。決策表中的每一行就是對應(yīng)模板的一行數(shù)據(jù),將產(chǎn)生一個規(guī)則。 運(yùn)行決策表Drools引擎所部署的系統(tǒng)中執(zhí)行決策表。首先,決策表轉(zhuǎn)換成的Drools規(guī)則語言(DRL),然后執(zhí)行規(guī)則引擎需求。這意味著它是可能的業(yè)務(wù)規(guī)則的變更,無需停止和啟動,或重新部署任何軟件。3.5.2決策表中的關(guān)鍵字WarningIn the following example the marker symbol$paramis used.Person(age = 42).Import, Variables and Functions的示例.4 drools規(guī)則jar更新4.1方法1KieServices kieServices = KieServices.Factory.get();ReleaseId releaseId = kieServices.newReleaseId( org.acme, myartifact, 1.0-SNAPSHOT );KieContainer kContainer = kieServices.newKieContainer( releaseId );KieScanner kScanner = kieServices.newKieScanner( kContainer );/ Start the KieScanner polling the Maven repository every 10 secondskScanner.start( 10000L );kScanner,遍歷本地或遠(yuǎn)程maven 規(guī)則jar是否更新。4.2方法2publicvoidinitService(StringgroupId,StringartifactId,Stringversion)throwsNotExistsExceptionks=KieServices.Factory.get();trykContainer=ks.newKieContainer(ks.newReleaseId(groupId,artifactId,version);catch(Exceptione)StringBuildersb=newStringBuilder(failtogetmavenruleskmodulefromgroupId:);sb.append(groupId).append(artifactId:).append(artifactId).append(version:).append(version).append();thrownewNotExistsException(sb.toString();if(null!=kContainer)kSession=kContainer.newStatelessKieSession(ksession-rules);OverridepublicvoidrefreshService(StringgroupId,StringartifactId,Stringversion)throwsNotExistsExceptiontrykContainer.updateToVersion(ks.newReleaseId(groupId,artifactId,version);catch(Exceptione)StringBuildersb=newStringBuilder(failtogetmavenruleskmodulefromgroupId:);sb.append(groupId).append(artifactId:).append(artifactId).append(version:).append(version).append();thrownewNotExistsException(sb.toString();if(null!=kContainer)kSession=kContainer.newStatelessKieSession(ksession-rules);OverridepublicvoidfireService(Messageinfo)kSession.execute(info);5 Drools規(guī)則 kmodul.xml 更新public void initStateFulService()kieServices = KieServices.Factory.get();resources = kieServices.getResources(); KieModuleModel kieModuleModel = kieServices.newKieModuleModel();/1 KieBaseModel baseModel = kieModuleModel.newKieBaseModel( FileSystemKBase).addPackage(rules);/2 baseModel.newKieSessionModel(FileSystemKSession);/3 fileSystem = kieServices.newKieFileSystem(); String xml = kieModuleModel.toXML(); System.out.println(xml); fileSystem.writeKModuleXML(xml);/5 String fileBasePath = Thread.currentThread().getContextClassLoader().getResource().getPath(); System.out.println(fileBasePath); fileBasePath = fileBasePath.substring(0,fileBasePath.length(); List fileList = GetAndReadAllFile.getFileList(new File(fileBasePath+comyeepayytfrules),drl); for (String sfile : fileList) fileSystem.write(src/main/resources/rules/Rule.drl, resources.newFileSystemResource(new File(sfile);/6 KieBuilder kb = kieServices.newKieBuilder(fileSystem); kb.buildAll();/7 if (kb.getResults().hasMessages(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 寵物行業(yè)用友t3進(jìn)銷存操作流程他
- 高校英語核心素養(yǎng)培養(yǎng)心得體會
- 學(xué)校2025少先隊(duì)志愿服務(wù)計(jì)劃
- 河道淤積清理環(huán)境保護(hù)方案及措施
- 2025年職業(yè)學(xué)校健康安全教育計(jì)劃
- 學(xué)習(xí)《銷售人員違反職業(yè)道德行為處理辦法》心得體會
- 醫(yī)美護(hù)理潔面服務(wù)流程設(shè)計(jì)
- 西師版五年級數(shù)學(xué)下冊教學(xué)反思計(jì)劃
- 紅色研學(xué)心得體會報告
- IT硬件物料控制流程
- 浙江國企招聘2025紹興市鏡湖開發(fā)集團(tuán)有限公司下屬國企招聘11人筆試參考題庫附帶答案詳解
- 廣東2025年中考模擬數(shù)學(xué)試卷試題及答案詳解
- 山東省濟(jì)南市歷城區(qū)圖片版2025年六年級下學(xué)期調(diào)研數(shù)學(xué)試卷含解析
- 4-11-01-01 國家職業(yè)標(biāo)準(zhǔn)供電服務(wù)員 (2025年版)
- 2025至2030中國正極補(bǔ)鋰劑市場供給格局狀與發(fā)展態(tài)勢報告
- 四川省宜賓市敘州區(qū)2025屆五下數(shù)學(xué)期末質(zhì)量跟蹤監(jiān)視試題含答案
- 2025年第九屆“學(xué)憲法、講憲法”活動知識競賽測試題庫及答案
- 工程預(yù)算審核報告回復(fù)函
- 醫(yī)藥行業(yè)銷售流程與培訓(xùn)手冊
- 深信服aES產(chǎn)品技術(shù)白皮書-V1.5
- 農(nóng)商銀行貸款合同電子版
評論
0/150
提交評論