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

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

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

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

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


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

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

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

  當(dāng)引擎執(zhí)行時(shí),會根據(jù)規(guī)則執(zhí)行隊(duì)列中的優(yōu)先順序逐條執(zhí)行規(guī)則執(zhí)行實(shí)例,由于規(guī)則的執(zhí)行部分可能會改變工作區(qū)的數(shù)據(jù)對象,從而會使隊(duì)列中的某些規(guī)則執(zhí)行實(shí)例因?yàn)闂l件改變而失效,必須從隊(duì)列中撤銷,也可能會激活原來不滿足條件的規(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ī)則條件匹配的效率問題。規(guī)則條件匹配的效率決定了引擎的性能,引擎需要迅速測試工作區(qū)中的數(shù)據(jù)對象,從加載的規(guī)則集中發(fā)現(xiàn)符合條件的規(guī)則,生成規(guī)則執(zhí)行實(shí)例。1982年美國卡耐基·梅隆大學(xué)的Charles L. Forgy發(fā)明了一種叫Rete算法,很好地解決了這方面的問題。目前世界頂尖的商用業(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平臺訪問規(guī)則引擎定義了一些簡單的API。

  Java規(guī)則引擎API在javax.rules包中定義,是訪問規(guī)則引擎的標(biāo)準(zhǔn)企業(yè)級API。Java規(guī)則引擎API允許客戶程序使用統(tǒng)一的方式和不同廠商的規(guī)則引擎產(chǎn)品交互,就如同使用JDBC編寫?yīng)毩⒂趶S商訪問不同的數(shù)據(jù)庫產(chǎn)品一樣。Java規(guī)則引擎API包括創(chuàng)建和管理規(guī)則集合的機(jī)制,在工作區(qū)中添加,刪除和修改對象的機(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ī)則對應(yīng)的動(dòng)作(執(zhí)行集 execution sets)以及實(shí)例化規(guī)則引擎。規(guī)則可以從外部資源中裝載,比如URI,Input streams, XML streams和readers等等。同時(shí)規(guī)則管理API還提供了注冊和取消注冊執(zhí)行集以及對執(zhí)行集進(jìn)行維護(hù)的機(jī)制。使用admin包定義規(guī)則有助于對客戶訪問運(yùn)行規(guī)則進(jìn)行控制管理,它通過在執(zhí)行集上定義許可權(quán)使得未經(jīng)授權(quán)的用戶無法訪問受控規(guī)則。

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

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

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

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

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

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

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

  規(guī)則引擎API將管理API和運(yùn)行時(shí)API加以分開,從而為這些包提供了較好粒度的安全控制。規(guī)則引擎API并沒有提供明顯的安全機(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)用戶才能訪問。

  3、異常與日志

  規(guī)則引擎API定義了javax.rules.RuleException作為規(guī)則引擎異常層次的根類。所有其它異常都繼承于這個(gè)根類。規(guī)則引擎中定義的異常都是受控制的異常(checked exceptions),所以捕獲異常的任務(wù)就交給了規(guī)則引擎。規(guī)則引擎API沒有提供明確的日志機(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ī)范,并沒有提供規(guī)則和動(dòng)作該如何定義以及該用什么語言定義規(guī)則,也沒有為規(guī)則引擎如何讀和評價(jià)規(guī)則提供技術(shù)性指導(dǎo)。

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