日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JSR94(Java Rule Engine)

發(fā)布時(shí)間:2024/1/17 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSR94(Java Rule Engine) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

from: IBM DeveloperWorks Java

URL: http://www.ibm.com/developerworks/cn/java/j-java-rules/#N10041

?

本文對(duì)Java規(guī)則引擎與其API(JSR-94)及相關(guān)實(shí)現(xiàn)做了較詳細(xì)的介紹,對(duì)其體系結(jié)構(gòu)和API應(yīng)用有較詳盡的描述,并指出Java規(guī)則引擎,規(guī)則語(yǔ)言,JSR-94的相互關(guān)系,以及JSR-94的不足之處和展望

?

復(fù)雜企業(yè)級(jí)項(xiàng)目的開(kāi)發(fā)以及其中隨外部條件不斷變化的業(yè)務(wù)規(guī)則(business logic),迫切需要分離商業(yè)決策者的商業(yè)決策邏輯和應(yīng)用開(kāi)發(fā)者的技術(shù)決策,并把這些商業(yè)決策放在中心數(shù)據(jù)庫(kù)或其他統(tǒng)一的地方,讓它們能在運(yùn)行時(shí)(即商 務(wù)時(shí)間)可以動(dòng)態(tài)地管理和修改從而提供軟件系統(tǒng)的柔性和適應(yīng)性。規(guī)則引擎正是應(yīng)用于上述動(dòng)態(tài)環(huán)境中的一種解決方法。

本文第一部分簡(jiǎn)要介紹了 規(guī)則引擎的產(chǎn)生背景和基于規(guī)則的專家系統(tǒng),第二部分介紹了什么是規(guī)則引擎及其架構(gòu)和算法,第三部分介紹了商業(yè)產(chǎn)品和開(kāi)源項(xiàng)目實(shí)現(xiàn)等各種Java規(guī)則引擎, 第四部分對(duì)Java規(guī)則引擎API(JSR-94)作了詳細(xì)介紹,講解了其體系結(jié)構(gòu),管理API和運(yùn)行時(shí)API及相關(guān)安全問(wèn)題,第五部分則對(duì)規(guī)則語(yǔ)言及其 標(biāo)準(zhǔn)化作了探討,第六部分給出了一個(gè)使用Java規(guī)則引擎API的簡(jiǎn)單示例,第七部分給予小結(jié)和展望。

1、 介紹
1.1 規(guī)則引擎產(chǎn)生背景
企 業(yè)管理者對(duì)企業(yè)級(jí)IT系統(tǒng)的開(kāi)發(fā)有著如下的要求:(1)為提高效率,管理流程必須自動(dòng)化,即使現(xiàn)代商業(yè)規(guī)則異常復(fù)雜(2)市場(chǎng)要求業(yè)務(wù)規(guī)則經(jīng)常變化,IT 系統(tǒng)必須依據(jù)業(yè)務(wù)規(guī)則的變化快速、低成本的更新(3)為了快速、低成本的更新,業(yè)務(wù)人員應(yīng)能直接管理IT系統(tǒng)中的規(guī)則,不需要程序開(kāi)發(fā)人員參與。

而 項(xiàng)目開(kāi)發(fā)人員則碰到了以下問(wèn)題:(1)程序=算法+數(shù)據(jù)結(jié)構(gòu),有些復(fù)雜的商業(yè)規(guī)則很難推導(dǎo)出算法和抽象出數(shù)據(jù)模型(2)軟件工程要求從需求->設(shè)計(jì) ->編碼,然而業(yè)務(wù)規(guī)則常常在需求階段可能還沒(méi)有明確,在設(shè)計(jì)和編碼后還在變化,業(yè)務(wù)規(guī)則往往嵌在系統(tǒng)各處代碼中(3)對(duì)程序員來(lái)說(shuō),系統(tǒng)已經(jīng)維 護(hù)、更新困難,更不可能讓業(yè)務(wù)人員來(lái)管理。

基于規(guī)則的專家系統(tǒng)的出現(xiàn)給開(kāi)發(fā)人員以解決問(wèn)題的契機(jī)。規(guī)則引擎由基于規(guī)則的專家系統(tǒng)中的推理引擎發(fā)展而來(lái)。下面簡(jiǎn)要介紹一下基于規(guī)則的專家系統(tǒng)。

1.2 基于規(guī)則的專家系統(tǒng)(RBES)
專家系統(tǒng)是人工智能的一個(gè)分支,它模仿人類的推理方式,使用試探性的方法進(jìn)行推理,并使用人類能理解的術(shù)語(yǔ)解釋和證明它的推理結(jié)論。專家系統(tǒng)有很多分類:神經(jīng)網(wǎng)絡(luò)、基于案例推理和基于規(guī)則系統(tǒng)等。

RBES包括三部分:Rule Base(knowledge base)、Working Memory(fact base)和Inference Engine(推理引擎)。它們的結(jié)構(gòu)如下所示:

圖1.基于規(guī)則的專家系統(tǒng)組成


如 上圖所示,推理引擎包括三部分:Pattern Matcher、Agenda和Execution Engine。Pattern Matcher何時(shí)執(zhí)行哪個(gè)規(guī)則;Agenda管理PatternMatcher挑選出來(lái)的規(guī)則的執(zhí)行次序;Execution Engine負(fù)責(zé)執(zhí)行規(guī)則和其他動(dòng)作。

推理引擎通過(guò)決定哪些規(guī)則滿足事實(shí)或目標(biāo),并授予規(guī)則優(yōu)先級(jí),滿足事實(shí)或目標(biāo)的規(guī)則被加入議程。 存在兩者推理方式:演繹法(Forward-Chaining正向鏈)和歸納法(Backward-Chaining反向鏈)。演繹法從一個(gè)初始的事實(shí)出發(fā),不斷地應(yīng)用規(guī)則得出結(jié)論(或執(zhí)行指定的動(dòng)作)。而歸納法則是從假設(shè)出發(fā),不斷地尋找符合假設(shè)的事實(shí)。

?

2、 規(guī)則引擎
2.1 業(yè)務(wù)規(guī)則
一個(gè)業(yè)務(wù)規(guī)則包含一組條件 和在此條件下執(zhí)行的操作,它們表示業(yè)務(wù)規(guī)則應(yīng)用程序的一段業(yè)務(wù)邏輯。業(yè)務(wù)規(guī)則通常應(yīng)該由業(yè)務(wù)分析人員和策略管理者開(kāi)發(fā)和修改,但有些復(fù)雜的業(yè)務(wù)規(guī)則也可以 由技術(shù)人員使用面向?qū)ο蟮募夹g(shù)語(yǔ)言或腳本來(lái)定制。業(yè)務(wù)規(guī)則的理論基礎(chǔ)是:設(shè)置一個(gè)或多個(gè)條件,當(dāng)滿足這些條件時(shí)會(huì)觸發(fā)一個(gè)或多個(gè)操作。

2.2 規(guī)則引擎
什 么是規(guī)則引擎?規(guī)則引擎是如何執(zhí)行規(guī)則的?這可以稱之為"什么"與"如何"的問(wèn)題。到底規(guī)則引擎是什么還是目前業(yè)界一個(gè)比較有爭(zhēng)議的問(wèn)題,在JSR-94 種也幾乎沒(méi)有定義。可以這樣認(rèn)為充分定義和解決了"如何"的問(wèn)題,"什么"問(wèn)題本質(zhì)上也迎刃而解。也許這又是一種"先有蛋還是先有雞"哲學(xué)爭(zhēng)論。今后標(biāo)準(zhǔn) 規(guī)則語(yǔ)言的定義和推出及相關(guān)標(biāo)準(zhǔn)的制定應(yīng)該可以給這樣的問(wèn)題和爭(zhēng)論劃上一個(gè)句號(hào)。本文中,暫且這樣述說(shuō)什么是規(guī)則引擎:規(guī)則引擎由推理引擎發(fā)展而來(lái),是一 種嵌入在應(yīng)用程序中的組件,實(shí)現(xiàn)了將業(yè)務(wù)決策從應(yīng)用程序代碼中分離出來(lái),并使用預(yù)定義的語(yǔ)義模塊編寫(xiě)業(yè)務(wù)決策。接受數(shù)據(jù)輸入,解釋業(yè)務(wù)規(guī)則,并根據(jù)規(guī)則做 出業(yè)務(wù)決策。

2.3 規(guī)則引擎的使用方式
由于規(guī)則引擎是軟件組件,所以只有開(kāi)發(fā)人員才能夠通過(guò) 程序接口的方式來(lái)使用和控制它,規(guī)則引擎的程序接口至少包含以下幾種API:加載和卸載規(guī)則集的API;數(shù)據(jù)操作的API;引擎執(zhí)行的API。開(kāi)發(fā)人員在 程序中使用規(guī)則引擎基本遵循以下5個(gè)典型的步驟:創(chuàng)建規(guī)則引擎對(duì)象;向引擎中加載規(guī)則集或更換規(guī)則集;向引擎提交需要被規(guī)則集處理的數(shù)據(jù)對(duì)象集合;命令引 擎執(zhí)行;導(dǎo)出引擎執(zhí)行結(jié)果,從引擎中撤出處理過(guò)的數(shù)據(jù)。使用了規(guī)則引擎之后,許多涉及業(yè)務(wù)邏輯的程序代碼基本被這五個(gè)典型步驟所取代。

一個(gè)開(kāi)放的業(yè)務(wù)規(guī)則引擎應(yīng)該可以"嵌入"在應(yīng)用程序的任何位置,不同位置的規(guī)則引擎可以使用不同的規(guī)則集,用于處理不同的數(shù)據(jù)對(duì)象。此外,對(duì)使用引擎的數(shù)量沒(méi)有限制。

2.4 規(guī)則引擎架構(gòu)與推理
規(guī)則引擎的架構(gòu)如下圖所示:

圖2. 業(yè)務(wù)規(guī)則引擎架構(gòu)


規(guī) 則引擎的推理步驟如下:a. 將初始數(shù)據(jù)(fact)輸入至工作內(nèi)存(Working Memory)。b. 使用Pattern Matcher將規(guī)則庫(kù)(Rules repository)中的規(guī)則(rule)和數(shù)據(jù)(fact)比較。c. 如果執(zhí)行規(guī)則存在沖突(conflict),即同時(shí)激活了多個(gè)規(guī)則,將沖突的規(guī)則放入沖突集合。d. 解決沖突,將激活的規(guī)則按順序放入Agenda。e. 執(zhí)行Agenda中的規(guī)則。重復(fù)步驟b至e,直到執(zhí)行完畢Agenda中的所有規(guī)則。

任何一個(gè)規(guī)則引擎都需要很好地解決規(guī)則的推理機(jī)制和規(guī)則條件匹配的效率問(wèn)題。

當(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í)例因 為條件改變而失效,必須從隊(duì)列中撤銷,也可能會(huì)激活原來(lái)不滿足條件的規(guī)則,生成新的規(guī)則執(zhí)行實(shí)例進(jìn)入隊(duì)列。于是就產(chǎn)生了一種"動(dòng)態(tài)"的規(guī)則執(zhí)行鏈,形成規(guī) 則的推理機(jī)制。這種規(guī)則的"鏈?zhǔn)?#34;反應(yīng)完全是由工作區(qū)中的數(shù)據(jù)驅(qū)動(dòng)的。

規(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算法。

2.5 規(guī)則引擎的算法
大 部分規(guī)則引擎產(chǎn)品的算法,基本上都來(lái)自于Dr. Charles Forgy在1979年提出的RETE算法及其變體,Rete算法是目前效率最高的一個(gè)Forward-Chaining推理算法,Drools項(xiàng)目是 Rete算法的一個(gè)面向?qū)ο蟮腏ava實(shí)現(xiàn),Rete算法其核心思想是將分離的匹配項(xiàng)根據(jù)內(nèi)容動(dòng)態(tài)構(gòu)造匹配樹(shù),以達(dá)到顯著降低計(jì)算量的效果。詳情請(qǐng)見(jiàn) CIS587:The RETE Algorithm,The Rete Algorithm,RETE演算法,《專家系統(tǒng)原理與編程》中第11章等。

?

?

3、 Java規(guī)則引擎
目前主流的規(guī)則引擎組件多是基于Java和C++程序語(yǔ)言環(huán)境,已經(jīng)有多種Java規(guī)則引擎商業(yè)產(chǎn)品與開(kāi)源項(xiàng)目的實(shí)現(xiàn),其中有的已經(jīng)支持JSR94,有的正朝這個(gè)方向做出努力,列出如下:

3.1 Java規(guī)則引擎商業(yè)產(chǎn)品
Java規(guī)則引擎商業(yè)產(chǎn)品主要有(Jess不是開(kāi)源項(xiàng)目,它可以免費(fèi)用于學(xué)術(shù)研究,但用于商業(yè)用途則要收費(fèi)):

3.2 Java規(guī)則引擎開(kāi)源項(xiàng)目
開(kāi)源項(xiàng)目的實(shí)現(xiàn)主要包括:

Drools - Drools規(guī)則引擎應(yīng)用Rete算法的改進(jìn)形式Rete-II算法。從內(nèi)部機(jī)制上講,它使用了和Forgy的算法相同的概念和方法,但是增加了可與面向?qū)ο笳Z(yǔ)言無(wú)縫連接的節(jié)點(diǎn)類型。

Mandarax 基于反向推理(歸納法)。能夠較容易地實(shí)現(xiàn)多個(gè)數(shù)據(jù)源的集成。例如,數(shù)據(jù)庫(kù)記錄能方便地集成為事實(shí)集(facts sets),reflection用來(lái)集成對(duì)象模型中的功能。目前不支持JSR 94

OFBiz Rule Engine - 支持歸納法(Backward chaining).最初代碼基于Steven John Metsker的"Building Parsers in Java",不支持JSR 94

JLisa - JLisa是用來(lái)構(gòu)建業(yè)務(wù)規(guī)則的強(qiáng)大框架,它有著擴(kuò)展了LISP優(yōu)秀特色的優(yōu)點(diǎn),比Clips還要強(qiáng)大.這些特色對(duì)于多范例軟件的開(kāi)發(fā)是至關(guān)重要的.支持JSR 94

其 它的開(kāi)源項(xiàng)目實(shí)現(xiàn)有諸如Algernon, TyRuBa, JTP, JEOPS, InfoSapient, RDFExpert, Jena 2, Euler, JLog, Pellet OWL Reasoner, Prova, OpenRules, SweetRules, JShop2等等。

?

?

4、 Java規(guī)則引擎API(JSR-94)
4.1 簡(jiǎn)介
過(guò) 去大部分的規(guī)則引擎開(kāi)發(fā)并沒(méi)有規(guī)范化,有其自有的API,這使得其與外部程序交互集成不夠靈活。轉(zhuǎn)而使用另外一種產(chǎn)品時(shí)往往意味需要重寫(xiě)應(yīng)用程序邏輯和 API調(diào)用,代價(jià)較大。規(guī)則引擎工業(yè)中標(biāo)準(zhǔn)的缺乏成為令人關(guān)注的重要方面。2003年11月定稿并于2004年8月最終發(fā)布的JSR 94(Java規(guī)則引擎API)使得Java規(guī)則引擎的實(shí)現(xiàn)得以標(biāo)準(zhǔn)化。

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

4.2 簡(jiǎn)介Java規(guī)則引擎API體系結(jié)構(gòu)
Java規(guī)則引擎API分為兩個(gè)主要部分:運(yùn)行時(shí)客戶API(the Runtime client API)和規(guī)則管理API(the rules administration API)。

4.2.1規(guī)則管理API

規(guī) 則管理API在javax.rules.admin中定義,包括裝載規(guī)則以及與規(guī)則對(duì)應(yīng)的動(dòng)作(執(zhí)行集 execution sets)以及實(shí)例化規(guī)則引擎。規(guī)則可以從外部資源中裝載,比如說(shuō)URI,Input streams, XML streams和readers等等.同時(shí)管理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ī)則。

管理API使用類 RuleServiceProvider來(lái)獲得規(guī)則管理(RuleAdministrator)接口的實(shí)例.規(guī)則管理接口提供方法注冊(cè)和取消注冊(cè)執(zhí)行集. 規(guī)則管理器(RuleAdministrator)提供了本地和遠(yuǎn)程的RuleExecutionSetProvider.在前面已提 及,RuleExecutionSetProvider負(fù)責(zé)創(chuàng)建規(guī)則執(zhí)行集.規(guī)則執(zhí)行集可以從如XML streams, input 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)源的情況并不多見(jiàn).為了避免這些情況中的網(wǎng)絡(luò)開(kāi)銷,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)使用它們。

4.2.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ī)則對(duì)話并且在這個(gè)對(duì)話中執(zhí)行規(guī)則。

運(yùn) 行時(shí)API提供了對(duì)廠商規(guī)則引擎API實(shí)現(xiàn)的類似于JDBC的訪問(wèn)方法.規(guī)則引擎廠商通過(guò)類RuleServiceProvider(類 RuleServiceProvider提供了對(duì)具體規(guī)則引擎實(shí)現(xiàn)的運(yùn)行時(shí)和管理API的訪問(wèn))將其規(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.客戶可以發(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)提供給用戶。

使用運(yùn)行時(shí)Runtime API的代碼片斷如下所示:

RuleServiceProvider ruleProvider =?
RuleServiceProviderManager.getRuleServiceProvider
("com.mycompany.myrulesengine.rules. RuleServiceProvider"); ??
RuleRuntime ruleRuntime = ruleProvider.getRuleRuntime();
StatelessRuleSession ruleSession = (StatelessRuleSession) ?
ruleRuntime.createRuleSession(ruleURL, null, RuleRuntime.STTELESS_SESSION_TYPE);
List inputRules = new ArrayList();
inputRules.add(new String("Rule 1"));
inputRules.add(new Integer(1));
List resultRules = ruleSession.executeRules(inputRules);
4.3 Java規(guī)則引擎API安全問(wèn)題
規(guī) 則引擎API將管理API和運(yùn)行時(shí)API加以分開(kāi),從而為這些包提供了較好粒度的安全控制.規(guī)則引擎API并沒(méi)有提供明顯的安全機(jī)制,它可以和J2EE規(guī) 范中定義的標(biāo)準(zhǔn)安全API聯(lián)合使用.安全可以由以下機(jī)制提供,如Java authentication and authorization service (JAAS),the Java cryptography extension (JCE),Java secure Socket Extension (JSSE),或者其它定制的安全API.JAAS能被用來(lái)定義規(guī)則執(zhí)行集的許可權(quán)限,從而只有授權(quán)用戶才能訪問(wèn)。

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

4.5 JSR 94 小結(jié)
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).JSR 94規(guī)范將上述問(wèn)題留給了規(guī)則引擎的廠商.在下一節(jié)我將簡(jiǎn)要介紹一下規(guī)則語(yǔ)言。

?

?

5、 規(guī)則語(yǔ)言
JSR 94中沒(méi)有涉及用來(lái)創(chuàng)建規(guī)則和動(dòng)作的語(yǔ)言.規(guī)則語(yǔ)言是規(guī)則引擎應(yīng)用程序的重要組成部分,所有的業(yè)務(wù)規(guī)則都必須用某種語(yǔ)言定義并且存儲(chǔ)于規(guī)則執(zhí)行集中,從而規(guī)則引擎可以裝載和處理他們。

由 于沒(méi)有關(guān)于規(guī)則如何定義的公用規(guī)范,市場(chǎng)上大多數(shù)流行的規(guī)則引擎都有其自己的規(guī)則語(yǔ)言,目前便有許多種規(guī)則語(yǔ)言正在應(yīng)用,因此,當(dāng)需要將應(yīng)用移植到其他的 Java規(guī)則引擎實(shí)現(xiàn)時(shí),可能需要變換規(guī)則定義,如將Drools私有的DRL規(guī)則語(yǔ)言轉(zhuǎn)換成標(biāo)準(zhǔn)的ruleML,Jess規(guī)則語(yǔ)言轉(zhuǎn)換成ruleML 等。這個(gè)工作一般由XSLT轉(zhuǎn)換器來(lái)完成。

規(guī)則語(yǔ)言的詳情這里不作詳細(xì)介紹,名稱及其網(wǎng)址列出如下:

Rule Markup language (RuleML) ? ? ? ? ? ? ? ? ? ? ? ?http://www.ruleml.org/
Simple Rule Markup Language (SRML) ? ? ? ? ? ? ? ? ? ?http://xml.coverpages.org/srml.html
Business Rules Markup Language (BRML) ? ? ? ? ? ? ? ? ? ?http://xml.coverpages.org/brml.html
SWRL: A Semantic Web Rule Language Combining OWL and RuleML ? http://www.daml.org/2003/11/swrl/
多 種規(guī)則語(yǔ)言的使用使得不同規(guī)則引擎實(shí)現(xiàn)之間的兼容性成為問(wèn)題.通用的規(guī)則引擎API或許可以減輕不同廠家API之間的問(wèn)題,但公用規(guī)則語(yǔ)言的缺乏將仍然阻 礙不同規(guī)則引擎實(shí)現(xiàn)之間的互操作性.盡管業(yè)界在提出公用規(guī)則語(yǔ)言上做出了一些努力, 比如說(shuō)RuleML,SRML的出現(xiàn),但距離獲得絕大部分規(guī)則引擎廠商同意的公用標(biāo)準(zhǔn)還有很長(zhǎng)的路要走。

?

6、 Java規(guī)則引擎API使用示例
6.1 設(shè)置規(guī)則引擎
Java 規(guī)則引擎的管理活動(dòng)階段開(kāi)始于查找一個(gè)合適的javax.rules.RuleServiceProvider對(duì)象,這個(gè)對(duì)象是應(yīng)用程序訪問(wèn)規(guī)則引擎的入 口。在J2EE環(huán)境中,你可能可以通過(guò)JNDI獲得RuleServiceProvider。否則,你可以使用 javax.rules.RuleServiceProviderManager類:

? ? javax.rules.RuleServiceProviderManager class:?
? ? ? ? ? ?String implName = "org.jcp.jsr94.ri.RuleServiceProvider";
? ? ? ? ? ?Class.forName(implName);
? ? ? ? ? ?RuleServiceProvider?
serviceProvider = RuleServiceProviderManager.getRuleServiceProvider(implName);
擁 有了RuleServiceProvider對(duì)象,你就可以獲得一個(gè)javax.rules.admin.RuleAdministrator類。從 RuleAdministrator類中,你可以得到一個(gè)RuleExecutionSetProvider,從類名可以知道,它用于創(chuàng)建 javax.rules.RuleExecutionSets對(duì)象。RuleExecutionSet基本上是一個(gè)裝入內(nèi)存的,準(zhǔn)備好執(zhí)行的規(guī)則集合。

包 javax.rules.admin包括兩個(gè)不同的RuleExecutionSetProvider類。 RuleExecutionSetProvider類本身包括了從Serializable對(duì)象創(chuàng)建RuleExecutionSets的方法,因此在規(guī) 則引擎位于遠(yuǎn)程服務(wù)器的情況下,仍然可以使用RuleExecutionSetProvider類,構(gòu)造器的參數(shù)可以通過(guò)RMI來(lái)傳遞。另一個(gè)類是 LocalRuleExecutionSetProvider,包含了其他方法,用于從非Serializable資源(如 java.io.Reader-本地文件)創(chuàng)建RuleExectionSets。假設(shè)擁有了一個(gè)RuleServiceProvider對(duì)象,你可以從 本地文件rules.xml文件創(chuàng)建一個(gè)RuleExectionSet對(duì)象。如以下的代碼所示:

RuleAdministrator admin = serviceProvider.getRuleAdministrator();
? ? ? ? ? HashMap properties = new HashMap();
? ? ? ? ? properties.put("name", "My Rules");
? ? ? ? ? properties.put("description", "A trivial rulebase");
? ? ? ? ? FileReader reader = new FileReader("rules.xml");
? ? ? ? ? RuleExecutionSet ruleSet = null;
? ? ? ? ? try {
? ? ? ? ? ? ? ?LocalRuleExecutionSetProvider lresp =
? ? ? ? ? ? ? ?admin.getLocalRuleExecutionSetProvider(properties);
? ? ? ? ? ? ? ?ruleSet = lresp.createRuleExecutionSet(reader, properties);
? ? ? ? ? } finally {
? ? ? ? ? ? ? ?reader.close();
? ? ? ? ? }
接下來(lái),你可以使用RuleAdministrator注冊(cè)獲得的 RuleExecutionSet,并給它分配一個(gè)名稱。在運(yùn)行時(shí),你可以用同一個(gè)名稱創(chuàng)建一個(gè)RuleSession;該RuleSession使用了 這個(gè)命名的RuleExecutionSet。參見(jiàn)下面的用法:admin.registerRuleExecutionSet("rules", ruleSet, properties);

6.2 執(zhí)行規(guī)則引擎
在運(yùn)行時(shí)階段,你可以參見(jiàn)一 個(gè)RuleSession對(duì)象。RuleSession對(duì)象基本上是一個(gè)裝載了特定規(guī)則集合的規(guī)則引擎實(shí)例。你從RuleServiceProvider 得到一個(gè)RuleRuntime對(duì)象,接下來(lái),從javax.rules.RuleRuntime得到RuleSession對(duì)象。

RuleSession 分為兩類:stateful和stateless。它們具有不同的功能。StatefulRuleSession的Working Memory能夠在多個(gè)方法調(diào)用期間保存狀態(tài)。你可以在多個(gè)方法調(diào)用期間在Working Memory中加入多個(gè)對(duì)象,然后執(zhí)行引擎,接下來(lái)還可以加入更多的對(duì)象并再次執(zhí)行引擎。相反,StatelessRuleSession類是不保存狀態(tài) 的,為了執(zhí)行它的executeRules方法,你必須為Working Memory提供所有的初始數(shù)據(jù),執(zhí)行規(guī)則引擎,得到一個(gè)內(nèi)容列表作為返回值。

下 面的例子中,我們創(chuàng)建一個(gè)StatefulRuleSession實(shí)例,添加兩個(gè)對(duì)象(一個(gè)Integer和一個(gè)String)到Working Memory,執(zhí)行規(guī)則,然后得到Working Memory中所有的內(nèi)容,作為java.util.List對(duì)象返回。最后,我們調(diào)用release方法清理RuleSession:

RuleRuntime runtime = rsp.getRuleRuntime();
? ? ? ? ?StatefulRuleSession session = (StatefulRuleSession)
? ? ? ? ?runtime.createRuleSession("rules", properties,
? ? ? ? ?RuleRuntime.STATEFUL_SESSION_TYPE);
? ? ? ? ?session.addObject(new Integer(1));
? ? ? ? ?session.addObject("A string");
? ? ? ? ?session.executeRules();
? ? ? ? ?List results = session.getObjects();
? ? ? ? ?session.release();
?

?

7、 結(jié)束語(yǔ)
Java規(guī)則引擎API(JSR-94)允許客戶程序使用統(tǒng)一的方式和不同廠商的規(guī)則引 擎產(chǎn)品交互,一定程度上給規(guī)則引擎廠商提供了標(biāo)準(zhǔn)化規(guī)范。但其幾乎沒(méi)有定義什么是規(guī)則引擎,當(dāng)然也沒(méi)有深入到規(guī)則是如何構(gòu)建和操縱的,規(guī)則調(diào)用的效用,規(guī) 則與Java語(yǔ)言的綁定等方面。并且JSR-94在對(duì)J2EE的支持上也不足。規(guī)則語(yǔ)言的標(biāo)準(zhǔn)化,JSR-94的進(jìn)一步的充實(shí)深化都有待研究。
?

總結(jié)

以上是生活随笔為你收集整理的JSR94(Java Rule Engine)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。