版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java規(guī)則引擎工作原理及其應(yīng)用作者:繳明洋譚慶平出處:計(jì)算機(jī)與信息技術(shù)責(zé)任編輯:\o"向本編輯提問(wèn)"方舟[2006-04-0608:18]Java規(guī)則引擎是一種嵌入在Java程序中的組件,它的任務(wù)是把當(dāng)前提交給引擎的Java數(shù)據(jù)對(duì)象與加載在引擎中的業(yè)務(wù)規(guī)則進(jìn)行測(cè)試和比對(duì)摘要Java規(guī)則引擎是一種嵌入在Java程序中的組件,它的任務(wù)是把當(dāng)前提交給引擎的Java數(shù)據(jù)對(duì)象與加載在引擎中的業(yè)務(wù)規(guī)則進(jìn)行測(cè)試和比對(duì),激活那些符合當(dāng)前數(shù)據(jù)狀態(tài)下的業(yè)務(wù)規(guī)則,根據(jù)業(yè)務(wù)規(guī)則中聲明的執(zhí)行邏輯,觸發(fā)應(yīng)用程序中對(duì)應(yīng)的操作。
引言
目前,Java社區(qū)推動(dòng)并發(fā)展了一種引人注目的新技術(shù)——Java規(guī)則引擎(RuleEngine)。利用它就可以在應(yīng)用系統(tǒng)中分離商業(yè)決策者的商業(yè)決策邏輯和應(yīng)用開發(fā)者的技術(shù)決策,并把這些商業(yè)決策放在中心數(shù)據(jù)庫(kù)或其他統(tǒng)一的地方,讓它們能在運(yùn)行時(shí)可以動(dòng)態(tài)地管理和修改,從而為企業(yè)保持靈活性和競(jìng)爭(zhēng)力提供有效的技術(shù)支持。
規(guī)則引擎的原理
1、基于規(guī)則的專家系統(tǒng)(RBES)簡(jiǎn)介
Java規(guī)則引擎起源于基于規(guī)則的專家系統(tǒng),而基于規(guī)則的專家系統(tǒng)又是專家系統(tǒng)的其中一個(gè)分支。專家系統(tǒng)屬于人工智能的范疇,它模仿人類的推理方式,使用試探性的方法進(jìn)行推理,并使用人類能理解的術(shù)語(yǔ)解釋和證明它的推理結(jié)論。為了更深入地了解Java規(guī)則引擎,下面簡(jiǎn)要地介紹基于規(guī)則的專家系統(tǒng)。RBES包括三部分:RuleBase(knowledgebase)、WorkingMemory(factbase)和InferenceEngine。它們的結(jié)構(gòu)如下系統(tǒng)所示:
圖1基于規(guī)則的專家系統(tǒng)構(gòu)成
如圖1所示,推理引擎包括三部分:模式匹配器(PatternMatcher)、議程(Agenda)和執(zhí)行引擎(ExecutionEngine)。推理引擎通過(guò)決定哪些規(guī)則滿足事實(shí)或目標(biāo),并授予規(guī)則優(yōu)先級(jí),滿足事實(shí)或目標(biāo)的規(guī)則被加入議程。模式匹配器決定選擇執(zhí)行哪個(gè)規(guī)則,何時(shí)執(zhí)行規(guī)則;議程管理模式匹配器挑選出來(lái)的規(guī)則的執(zhí)行次序;執(zhí)行引擎負(fù)責(zé)執(zhí)行規(guī)則和其他動(dòng)作。
和人類的思維相對(duì)應(yīng),推理引擎存在兩者推理方式:演繹法(Forward-Chaining)和歸納法(Backward-Chaining)。演繹法從一個(gè)初始的事實(shí)出發(fā),不斷地應(yīng)用規(guī)則得出結(jié)論(或執(zhí)行指定的動(dòng)作)。而歸納法則是根據(jù)假設(shè),不斷地尋找符合假設(shè)的事實(shí)。Rete算法是目前效率最高的一個(gè)Forward-Chaining推理算法,許多Java規(guī)則引擎都是基于Rete算法來(lái)進(jìn)行推理計(jì)算的。
推理引擎的推理步驟如下:
(1)將初始數(shù)據(jù)(fact)輸入WorkingMemory。
(2)使用PatternMatcher比較規(guī)則庫(kù)(rulebase)中的規(guī)則(rule)和數(shù)據(jù)(fact)。
(3)如果執(zhí)行規(guī)則存在沖突(conflict),即同時(shí)激活了多個(gè)規(guī)則,將沖突的規(guī)則放入沖突集合。
(4)解決沖突,將激活的規(guī)則按順序放入Agenda。
(5)使用執(zhí)行引擎執(zhí)行Agenda中的規(guī)則。重復(fù)步驟2至5,直到執(zhí)行完畢所有Agenda中的規(guī)則。
上述即是規(guī)則引擎的原始架構(gòu),Java規(guī)則引擎就是從這一原始架構(gòu)演變而來(lái)的。
2、規(guī)則引擎相關(guān)構(gòu)件
規(guī)則引擎是一種根據(jù)規(guī)則中包含的指定過(guò)濾條件,判斷其能否匹配運(yùn)行時(shí)刻的實(shí)時(shí)條件來(lái)執(zhí)行規(guī)則中所規(guī)定的動(dòng)作的引擎。與規(guī)則引擎相關(guān)的有四個(gè)基本概念,為更好地理解規(guī)則引擎的工作原理,下面將對(duì)這些概念進(jìn)行逐一介紹。
1)信息元(InformationUnit)
信息元是規(guī)則引擎的基本建筑塊,它是一個(gè)包含了特定事件的所有信息的對(duì)象。這些信息包括:消息、產(chǎn)生事件的應(yīng)用程序標(biāo)識(shí)、事件產(chǎn)生事件、信息元類型、相關(guān)規(guī)則集、通用方法、通用屬性以及一些系統(tǒng)相關(guān)信息等等。
2)信息服務(wù)(InformationServices)
信息服務(wù)產(chǎn)生信息元對(duì)象。每個(gè)信息服務(wù)產(chǎn)生它自己類型相對(duì)應(yīng)的信息元對(duì)象。即特定信息服務(wù)根據(jù)信息元所產(chǎn)生每個(gè)信息元對(duì)象有相同的格式,但可以有不同的屬性和規(guī)則集。需要注意的是,在一臺(tái)機(jī)器上可以運(yùn)行許多不同的信息服務(wù),還可以運(yùn)行同一信息服務(wù)的不同實(shí)例。但無(wú)論如何,每個(gè)信息服務(wù)只產(chǎn)生它自己類型相對(duì)應(yīng)的信息元。
3)規(guī)則集(RuleSet)
顧名思義,規(guī)則集就是許多規(guī)則的集合。每條規(guī)則包含一個(gè)條件過(guò)濾器和多個(gè)動(dòng)作。一個(gè)條件過(guò)濾器可以包含多個(gè)過(guò)濾條件。條件過(guò)濾器是多個(gè)布爾表達(dá)式的組合,其組合結(jié)果仍然是一個(gè)布爾類型的。在程序運(yùn)行時(shí),動(dòng)作將會(huì)在條件過(guò)濾器值為真的情況下執(zhí)行。除了一般的執(zhí)行動(dòng)作,還有三類比較特別的動(dòng)作,它們分別是:放棄動(dòng)作(DiscardAction)、包含動(dòng)作(IncludeAction)和使信息元對(duì)象內(nèi)容持久化的動(dòng)作。前兩種動(dòng)作類型的區(qū)別將在2.3規(guī)則引擎工作機(jī)制小節(jié)介紹。
4)隊(duì)列管理器(QueueManager)
隊(duì)列管理器用來(lái)管理來(lái)自不同信息服務(wù)的信息元對(duì)象的隊(duì)列。
下面將研究規(guī)則引擎的這些相關(guān)構(gòu)件是如何協(xié)同工作的。
如圖2所示,處理過(guò)程分為四個(gè)階段進(jìn)行:信息服務(wù)接受事件并將其轉(zhuǎn)化為信息元,然后這些信息元被傳給隊(duì)列管理器,最后規(guī)則引擎接收這些信息元并應(yīng)用它們自身攜帶的規(guī)則加以執(zhí)行,直到隊(duì)列管理器中不再有信息元。
圖2處理過(guò)程協(xié)作圖
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)作(DiscardAction)和包含動(dòng)作(IncludeAction)。放棄動(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)行。圖3規(guī)則引擎工作機(jī)制
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)存(WorkingMemory)即工作區(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所示。
圖4Java規(guī)則引擎工作機(jī)制
當(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é)的CharlesL.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(TheRulesAdministratorAPI)和運(yùn)行時(shí)客戶API(TheRuntimeClientAPI)。
1)規(guī)則管理API
規(guī)則管理API在javax.rules.admin中定義,包含裝載規(guī)則以及與規(guī)則對(duì)應(yīng)的動(dòng)作(執(zhí)行集executionsets)以及實(shí)例化規(guī)則引擎。規(guī)則可以從外部資源中裝載,比如URI,Inputstreams,XMLstreams和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í)行集可以從如XMLstreams,binarystreams等來(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è)方式類似于JDBCAPI的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)在serviceprovider注冊(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。客戶可以發(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ì)話接口(RuleSessionInterface)提供給用戶。
2、Java規(guī)則引擎API安全問(wèn)題
規(guī)則引擎API將管理
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 物流公司2025年度網(wǎng)絡(luò)安全防護(hù)合同3篇
- 2024版技術(shù)研發(fā)合作合同
- 二零二五年度農(nóng)副產(chǎn)品種植基地建設(shè)與投資合同
- 2025版牛羊肉冷鏈物流信息化建設(shè)與運(yùn)營(yíng)合同4篇
- 2025年度環(huán)保節(jié)能技術(shù)引進(jìn)與應(yīng)用實(shí)施合同2篇
- 二零二五年度模具采購(gòu)合同與模具生產(chǎn)效率提升合同4篇
- 2025年度個(gè)人肖像權(quán)使用合同
- 2025年度個(gè)人股份轉(zhuǎn)讓與公司治理優(yōu)化合同4篇
- 2025年度管道工程鋼管腳手架安裝與拆除合同
- 2025年度個(gè)人銷售傭金合同(含年度銷售目標(biāo)設(shè)定)4篇
- 鄉(xiāng)村治理中正式制度與非正式制度的關(guān)系解析
- 2024版義務(wù)教育小學(xué)數(shù)學(xué)課程標(biāo)準(zhǔn)
- 智能護(hù)理:人工智能助力的醫(yī)療創(chuàng)新
- 國(guó)家中小學(xué)智慧教育平臺(tái)培訓(xùn)專題講座
- 5G+教育5G技術(shù)在智慧校園教育專網(wǎng)系統(tǒng)的應(yīng)用
- 服務(wù)人員隊(duì)伍穩(wěn)定措施
- VI設(shè)計(jì)輔助圖形設(shè)計(jì)
- 淺談小學(xué)勞動(dòng)教育的開展與探究 論文
- 2023年全國(guó)4月高等教育自學(xué)考試管理學(xué)原理00054試題及答案新編
- 河北省大學(xué)生調(diào)研河北社會(huì)調(diào)查活動(dòng)項(xiàng)目申請(qǐng)書
- JJG 921-2021環(huán)境振動(dòng)分析儀
評(píng)論
0/150
提交評(píng)論