首頁(yè) 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡(luò)課程 模擬考試 考友錄 實(shí)用文檔 求職招聘 論文下載
2011中考 | 2011高考 | 2012考研 | 考研培訓(xùn) | 在職研 | 自學(xué)考試 | 成人高考 | 法律碩士 | MBA考試
MPA考試 | 中科院
四六級(jí) | 職稱英語(yǔ) | 商務(wù)英語(yǔ) | 公共英語(yǔ) | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT
新概念英語(yǔ) | 成人英語(yǔ)三級(jí) | 申碩英語(yǔ) | 攻碩英語(yǔ) | 職稱日語(yǔ) | 日語(yǔ)學(xué)習(xí) | 法語(yǔ) | 德語(yǔ) | 韓語(yǔ)
計(jì)算機(jī)等級(jí)考試 | 軟件水平考試 | 職稱計(jì)算機(jī) | 微軟認(rèn)證 | 思科認(rèn)證 | Oracle認(rèn)證 | Linux認(rèn)證
華為認(rèn)證 | Java認(rèn)證
公務(wù)員 | 報(bào)關(guān)員 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 期貨從業(yè)資格 | 司法考試 | 法律顧問(wèn) | 導(dǎo)游資格
報(bào)檢員 | 教師資格 | 社會(huì)工作者 | 外銷員 | 國(guó)際商務(wù)師 | 跟單員 | 單證員 | 物流師 | 價(jià)格鑒證師
人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業(yè)資格 | 廣告師職業(yè)水平
駕駛員 | 網(wǎng)絡(luò)編輯
衛(wèi)生資格 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格考試會(huì)計(jì)證) | 經(jīng)濟(jì)師 | 會(huì)計(jì)職稱 | 注冊(cè)會(huì)計(jì)師 | 審計(jì)師 | 注冊(cè)稅務(wù)師
注冊(cè)資產(chǎn)評(píng)估師 | 高級(jí)會(huì)計(jì)師 | ACCA | 統(tǒng)計(jì)師 | 精算師 | 理財(cái)規(guī)劃師 | 國(guó)際內(nèi)審師
一級(jí)建造師 | 二級(jí)建造師 | 造價(jià)工程師 | 造價(jià)員 | 咨詢工程師 | 監(jiān)理工程師 | 安全工程師
質(zhì)量工程師 | 物業(yè)管理師 | 招標(biāo)師 | 結(jié)構(gòu)工程師 | 建筑師 | 房地產(chǎn)估價(jià)師 | 土地估價(jià)師 | 巖土師
設(shè)備監(jiān)理師 | 房地產(chǎn)經(jīng)紀(jì)人 | 投資項(xiàng)目管理師 | 土地登記代理人 | 環(huán)境影響評(píng)價(jià)師 | 環(huán)保工程師
城市規(guī)劃師 | 公路監(jiān)理師 | 公路造價(jià)師 | 安全評(píng)價(jià)師 | 電氣工程師 | 注冊(cè)測(cè)繪師 | 注冊(cè)計(jì)量師
繽紛校園 | 實(shí)用文檔 | 英語(yǔ)學(xué)習(xí) | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲

等考二級(jí)JAVA:Java規(guī)則引擎工作原理及應(yīng)用

本文為“等考二級(jí)JAVA:Java規(guī)則引擎工作原理及應(yīng)用”,以供廣大學(xué)員參考使用。更多關(guān)于計(jì)算機(jī)等級(jí)考試資料,請(qǐng)?jiān)L問(wèn)考試吧計(jì)算機(jī)等級(jí)考試頻道。

  3、規(guī)則引擎的工作機(jī)制

  下面專門研究規(guī)則引擎的內(nèi)部處理過(guò)程。如圖3所示,規(guī)則引擎從隊(duì)列管理器中依次接收信息元,然后依規(guī)則的定義順序檢查信息元所帶規(guī)則集中的規(guī)則。如圖所示,規(guī)則引擎檢查第一個(gè)規(guī)則并對(duì)其條件過(guò)濾器求值,如果值為假,所有與此規(guī)則相關(guān)的動(dòng)作皆被忽略并繼續(xù)執(zhí)行下一條規(guī)則。如果第二條規(guī)則的過(guò)濾器值為真,所有與此規(guī)則相關(guān)的動(dòng)作皆依定義順序執(zhí)行,執(zhí)行完畢繼續(xù)下一條規(guī)則。該信息元中的所有規(guī)則執(zhí)行完畢后,信息元將被銷毀,然后從隊(duì)列管理器接收下一個(gè)信息元。在這個(gè)過(guò)程中并未考慮兩個(gè)特殊動(dòng)作:放棄動(dòng)作(Discard Action)和包含動(dòng)作(Include Action)。放棄動(dòng)作如果被執(zhí)行,將會(huì)跳過(guò)其所在信息元中接下來(lái)的所有規(guī)則,并銷毀所在信息元,規(guī)則引擎繼續(xù)接收隊(duì)列管理器中的下一個(gè)信息元。包含動(dòng)作其實(shí)就是動(dòng)作中包含其它現(xiàn)存規(guī)則集的動(dòng)作。包含動(dòng)作如果被執(zhí)行,規(guī)則引擎將暫停并進(jìn)入被包含的規(guī)則集,執(zhí)行完畢后,規(guī)則引擎還會(huì)返回原來(lái)暫停的地方繼續(xù)執(zhí)行。這一過(guò)程將遞歸進(jìn)行。


等考二級(jí)JAVA:Java規(guī)則引擎工作原理及應(yīng)用

  Java規(guī)則引擎的工作機(jī)制與上述規(guī)則引擎機(jī)制十分類似,只不過(guò)對(duì)上述概念進(jìn)行了重新包裝組合。Java規(guī)則引擎對(duì)提交給引擎的Java數(shù)據(jù)對(duì)象進(jìn)行檢索,根據(jù)這些對(duì)象的當(dāng)前屬性值和它們之間的關(guān)系,從加載到引擎的規(guī)則集中發(fā)現(xiàn)符合條件的規(guī)則,創(chuàng)建這些規(guī)則的執(zhí)行實(shí)例。這些實(shí)例將在引擎接到執(zhí)行指令時(shí)、依照某種優(yōu)先序依次執(zhí)行。一般來(lái)講,Java規(guī)則引擎內(nèi)部由下面幾個(gè)部分構(gòu)成:工作內(nèi)存(Working Memory)即工作區(qū),用于存放被引擎引用的數(shù)據(jù)對(duì)象集合;規(guī)則執(zhí)行隊(duì)列,用于存放被激活的規(guī)則執(zhí)行實(shí)例;靜態(tài)規(guī)則區(qū),用于存放所有被加載的業(yè)務(wù)規(guī)則,這些規(guī)則將按照某種數(shù)據(jù)結(jié)構(gòu)組織,當(dāng)工作區(qū)中的數(shù)據(jù)發(fā)生改變后,引擎需要迅速根據(jù)工作區(qū)中的對(duì)象現(xiàn)狀,調(diào)整規(guī)則執(zhí)行隊(duì)列中的規(guī)則執(zhí)行實(shí)例。Java規(guī)則引擎的結(jié)構(gòu)示意圖如圖4所示。

等考二級(jí)JAVA:Java規(guī)則引擎工作原理及應(yīng)用

  當(dāng)引擎執(zhí)行時(shí),會(huì)根據(jù)規(guī)則執(zhí)行隊(duì)列中的優(yōu)先順序逐條執(zhí)行規(guī)則執(zhí)行實(shí)例,由于規(guī)則的執(zhí)行部分可能會(huì)改變工作區(qū)的數(shù)據(jù)對(duì)象,從而會(huì)使隊(duì)列中的某些規(guī)則執(zhí)行實(shí)例因?yàn)闂l件改變而失效,必須從隊(duì)列中撤銷,也可能會(huì)激活原來(lái)不滿足條件的規(guī)則,生成新的規(guī)則執(zhí)行實(shí)例進(jìn)入隊(duì)列。于是就產(chǎn)生了一種“動(dòng)態(tài)”的規(guī)則執(zhí)行鏈,形成規(guī)則的推理機(jī)制。這種規(guī)則的“鏈?zhǔn)健狈磻?yīng)完全是由工作區(qū)中的數(shù)據(jù)驅(qū)動(dòng)的。

  任何一個(gè)規(guī)則引擎都需要很好地解決規(guī)則的推理機(jī)制和規(guī)則條件匹配的效率問(wèn)題。規(guī)則條件匹配的效率決定了引擎的性能,引擎需要迅速測(cè)試工作區(qū)中的數(shù)據(jù)對(duì)象,從加載的規(guī)則集中發(fā)現(xiàn)符合條件的規(guī)則,生成規(guī)則執(zhí)行實(shí)例。1982年美國(guó)卡耐基·梅隆大學(xué)的Charles L. Forgy發(fā)明了一種叫Rete算法,很好地解決了這方面的問(wèn)題。目前世界頂尖的商用業(yè)務(wù)規(guī)則引擎產(chǎn)品基本上都使用Rete算法。

  Java規(guī)則引擎API——JSR-94

  為了使規(guī)則引擎技術(shù)標(biāo)準(zhǔn)化,Java社區(qū)制定了Java規(guī)則引擎API(JSR94)規(guī)范。它為Java平臺(tái)訪問(wèn)規(guī)則引擎定義了一些簡(jiǎn)單的API。

  Java規(guī)則引擎API在javax.rules包中定義,是訪問(wèn)規(guī)則引擎的標(biāo)準(zhǔn)企業(yè)級(jí)API。Java規(guī)則引擎API允許客戶程序使用統(tǒng)一的方式和不同廠商的規(guī)則引擎產(chǎn)品交互,就如同使用JDBC編寫?yīng)毩⒂趶S商訪問(wèn)不同的數(shù)據(jù)庫(kù)產(chǎn)品一樣。Java規(guī)則引擎API包括創(chuàng)建和管理規(guī)則集合的機(jī)制,在工作區(qū)中添加,刪除和修改對(duì)象的機(jī)制,以及初始化,重置和執(zhí)行規(guī)則引擎的機(jī)制。

  1、Java規(guī)則引擎API體系結(jié)構(gòu)

  Java規(guī)則引擎API主要由兩大類API組成: 規(guī)則管理API(The Rules Administrator API)和運(yùn)行時(shí)客戶API(The Runtime Client API)。

  1)規(guī)則管理API

  規(guī)則管理API在javax.rules.admin中定義,包含裝載規(guī)則以及與規(guī)則對(duì)應(yīng)的動(dòng)作(執(zhí)行集 execution sets)以及實(shí)例化規(guī)則引擎。規(guī)則可以從外部資源中裝載,比如URI,Input streams, XML streams和readers等等。同時(shí)規(guī)則管理API還提供了注冊(cè)和取消注冊(cè)執(zhí)行集以及對(duì)執(zhí)行集進(jìn)行維護(hù)的機(jī)制。使用admin包定義規(guī)則有助于對(duì)客戶訪問(wèn)運(yùn)行規(guī)則進(jìn)行控制管理,它通過(guò)在執(zhí)行集上定義許可權(quán)使得未經(jīng)授權(quán)的用戶無(wú)法訪問(wèn)受控規(guī)則。

  規(guī)則管理API使用類RuleServiceProvider來(lái)獲得規(guī)則管理器(RuleAdministrator)接口的實(shí)例。該接口提供方法注冊(cè)和取消注冊(cè)執(zhí)行集。規(guī)則管理器提供了本地和遠(yuǎn)程的RuleExecutionSetProvider,它負(fù)責(zé)創(chuàng)建規(guī)則執(zhí)行集(RuleExecutionSet)。規(guī)則執(zhí)行集可以從如XML streams, binary streams等來(lái)源中創(chuàng)建。這些數(shù)據(jù)來(lái)源及其內(nèi)容經(jīng)匯集和序列化后傳送到遠(yuǎn)程的運(yùn)行規(guī)則引擎的服務(wù)器上。在大多數(shù)應(yīng)用程序中,遠(yuǎn)程規(guī)則引擎或遠(yuǎn)程規(guī)則數(shù)據(jù)來(lái)源的情況并不多。為了避免這些情況中的網(wǎng)絡(luò)開銷,API規(guī)定了可以從運(yùn)行在同一JVM中規(guī)則庫(kù)中讀取數(shù)據(jù)的本地RuleExecutionSetProvider。規(guī)則執(zhí)行集接口除了擁有能夠獲得有關(guān)規(guī)則執(zhí)行集的方法,還有能夠檢索在規(guī)則執(zhí)行集中定義的所有規(guī)則對(duì)象。這使得客戶能夠知道規(guī)則集中的規(guī)則對(duì)象并且按照自己需要來(lái)使用它們。

  2)運(yùn)行時(shí)客戶API

  運(yùn)行時(shí)API在javax.rules包中定義,為規(guī)則引擎用戶運(yùn)行規(guī)則獲得結(jié)果提供了類和方法。運(yùn)行時(shí)客戶只能訪問(wèn)那些使用規(guī)則管理API注冊(cè)過(guò)的規(guī)則,運(yùn)行時(shí)API幫助用戶獲得規(guī)則會(huì)話,并在這個(gè)會(huì)話中執(zhí)行規(guī)則。

  運(yùn)行時(shí)API提供了對(duì)廠商規(guī)則引擎API的訪問(wèn)方法,這類似于JDBC。類RuleServiceProvider提供了對(duì)具體規(guī)則引擎實(shí)現(xiàn)的運(yùn)行時(shí)和管理API的訪問(wèn),規(guī)則引擎廠商通過(guò)該類將其規(guī)則引擎實(shí)現(xiàn)提供給客戶,并獲得RuleServiceProvider唯一標(biāo)識(shí)規(guī)則引擎的URL。此URL的標(biāo)準(zhǔn)用法是使用類似于“com.mycompany.myrulesengine.rules.RuleServiceProvider”這樣的Internet域名空間,這保證了訪問(wèn)URL的唯一性。類RuleServiceProvider內(nèi)部實(shí)現(xiàn)了規(guī)則管理和運(yùn)行時(shí)訪問(wèn)所需的接口。所有的RuleServiceProvider要想被客戶所訪問(wèn)都必須用RuleServiceProviderManager進(jìn)行注冊(cè),注冊(cè)方式類似于JDBC API的DriverManager和Driver。

  運(yùn)行時(shí)接口是運(yùn)行時(shí)API的關(guān)鍵部分。運(yùn)行時(shí)接口提供了用于創(chuàng)建規(guī)則會(huì)話(RuleSession)的方法,規(guī)則會(huì)話是用來(lái)運(yùn)行規(guī)則的。運(yùn)行時(shí)API同時(shí)也提供了訪問(wèn)在service provider注冊(cè)過(guò)的所有規(guī)則執(zhí)行集(RuleExecutionSets)。規(guī)則會(huì)話接口定義了客戶使用的會(huì)話的類型,客戶根據(jù)自己運(yùn)行規(guī)則的方式可以選擇使用有狀態(tài)會(huì)話或者無(wú)狀態(tài)會(huì)話。無(wú)狀態(tài)會(huì)話的工作方式就像一個(gè)無(wú)狀態(tài)會(huì)話bean?蛻艨梢园l(fā)送單個(gè)輸入對(duì)象或一列對(duì)象來(lái)獲得輸出對(duì)象。當(dāng)客戶需要一個(gè)與規(guī)則引擎間的專用會(huì)話時(shí),有狀態(tài)會(huì)話就很有用。輸入的對(duì)象通過(guò)addObject()方法可以加入到會(huì)話當(dāng)中。同一個(gè)會(huì)話當(dāng)中可以加入多個(gè)對(duì)象。對(duì)話中已有對(duì)象可以通過(guò)使用updateObject()方法得到更新。只要客戶與規(guī)則引擎間的會(huì)話依然存在,會(huì)話中的對(duì)象就不會(huì)丟失。

  RuleExecutionSetMetaData接口提供給客戶讓其查找規(guī)則執(zhí)行集的元數(shù)據(jù)(metadata)。元數(shù)據(jù)通過(guò)規(guī)則會(huì)話接口(RuleSession Interface)提供給用戶。

  2、Java規(guī)則引擎API安全問(wèn)題

  規(guī)則引擎API將管理API和運(yùn)行時(shí)API加以分開,從而為這些包提供了較好粒度的安全控制。規(guī)則引擎API并沒(méi)有提供明顯的安全機(jī)制,它可以和J2EE規(guī)范中定義的標(biāo)準(zhǔn)安全API聯(lián)合使用。安全可以由以下機(jī)制提供,如Java 認(rèn)證和授權(quán)服務(wù) (JAAS),Java加密擴(kuò)展(JCE),Java安全套接字?jǐn)U展(JSSE),或者其它定制的安全API。使用JAAS可以定義規(guī)則執(zhí)行集的許可權(quán)限,從而只有授權(quán)用戶才能訪問(wèn)。

  3、異常與日志

  規(guī)則引擎API定義了javax.rules.RuleException作為規(guī)則引擎異常層次的根類。所有其它異常都繼承于這個(gè)根類。規(guī)則引擎中定義的異常都是受控制的異常(checked exceptions),所以捕獲異常的任務(wù)就交給了規(guī)則引擎。規(guī)則引擎API沒(méi)有提供明確的日志機(jī)制,但是它建議將Java Logging API用于規(guī)則引擎API。

  JSR 94 為規(guī)則引擎提供了公用標(biāo)準(zhǔn)API,僅僅為實(shí)現(xiàn)規(guī)則管理API和運(yùn)行時(shí)API提供了指導(dǎo)規(guī)范,并沒(méi)有提供規(guī)則和動(dòng)作該如何定義以及該用什么語(yǔ)言定義規(guī)則,也沒(méi)有為規(guī)則引擎如何讀和評(píng)價(jià)規(guī)則提供技術(shù)性指導(dǎo)。

  相關(guān)推薦:計(jì)算機(jī)等考二級(jí)JAVA基礎(chǔ)知識(shí):Java異常集
       計(jì)算機(jī)等考二級(jí)JAVA:Java六種異常處理的陋習(xí)
       考試吧:2010年上半年計(jì)算機(jī)等級(jí)考試備考專題
文章搜索
版權(quán)聲明:如果計(jì)算機(jī)等級(jí)考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本計(jì)算機(jī)等級(jí)考試網(wǎng)內(nèi)容,請(qǐng)注明出處。