隨筆 - 175  文章 - 202  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          第一個(gè)Blog,記錄哈哈的生活

          常用鏈接

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Java links

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          JSF 是一個(gè)頁(yè)面開(kāi)發(fā)能力極強(qiáng)的技術(shù),又擁有大量的擴(kuò)展。同時(shí) JSF 提供了一定的 IoC 能力,如果再集成 Spring 強(qiáng)大的 IoC 能力,將會(huì)給我們帶來(lái)更多的方便(其實(shí)我是喜歡用 Spring 集成 Hibernate 的 ORM 能力和 Spring 的事物管理 ^_^)。
          Spring 本身已經(jīng)提供了集成 JSF 的能力,只要在 JSF 的 配置文件中增加一個(gè) resolver 就可以了,具體如下:
          <faces-config>
          ? <application>
          ??? <message-bundle>resources.application</message-bundle>
          ??? <locale-config>
          ????? <default-locale>zh_CN</default-locale>
          ??? </locale-config>
          ??? <variable-resolver>
          ???? org.springframework.web.jsf.DelegatingVariableResolver
          ??? </variable-resolver>
          ? </application>
          ...
          </faces-config>
          posted @ 2006-04-23 09:16 哈哈的日子 閱讀(1863) | 評(píng)論 (0)編輯 收藏

          ????????本文對(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)組成
          圖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ǔ)義模塊編寫業(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)
          圖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í)例因?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)的。

            規(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ì)算量的效果。

            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í)往往意味需要重寫應(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編寫?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í)深化都有待研究。
          ?????????轉(zhuǎn)載自 http://www.javajia.com/modules.php?op=modload&name=News&file=article&sid=1545&mode=thread&order=0&thold=0


          posted @ 2006-03-29 22:43 哈哈的日子 閱讀(529) | 評(píng)論 (0)編輯 收藏
          何仁杰 梁冰

          業(yè)務(wù)規(guī)則管理系統(tǒng)的基本原理是:用一個(gè)或多個(gè)規(guī)則引擎替換以程序代碼“固化”在應(yīng)用系統(tǒng)中的業(yè)務(wù)邏輯。一個(gè)完善的BRMS可以對(duì)業(yè)務(wù)規(guī)則的整個(gè)生命周期實(shí)現(xiàn)全程管理。

          業(yè)務(wù)規(guī)則的全生命周期管理如圖1所示。BRMS在應(yīng)用系統(tǒng)中的地位與數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)類似,處于比較基礎(chǔ)的位置,是其他高端應(yīng)用的基石。圖2是GIGA Information Group 給出的IT架構(gòu)中BRMS的位置圖。

          業(yè)務(wù)規(guī)則管理如何實(shí)現(xiàn)?

          業(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è)操作。

          規(guī)則引擎

          這是一種嵌入在應(yīng)用程序中的組件,它的任務(wù)是把當(dāng)前提交給引擎的數(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)的操作。

          目前主流的規(guī)則引擎組件多是基于Java和C++程序語(yǔ)言環(huán)境。在2000年11月,Java Community Process(簡(jiǎn)稱JCP) 組織開(kāi)始著手起草Java規(guī)則引擎的API標(biāo)準(zhǔn),即JSR 94 規(guī)范。參與JSR 94起草的有BEA、IBM、ILOG、甲骨文、Novell、ATG、Unisys、Fujitsu等著名的軟件企業(yè)。JSR 94 在2003年11月25日正式定稿,支持JSR 94標(biāo)準(zhǔn)的規(guī)則引擎也幾乎同時(shí)推向市場(chǎng),包括ILOG 的JRules和Blaze的Advisor。

          規(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)有限制。

          規(guī)則引擎的內(nèi)部實(shí)現(xiàn)

          規(guī)則引擎的基本機(jī)制是:對(duì)提交給引擎的數(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í)行。一般,規(guī)則引擎內(nèi)部由下面幾個(gè)部分構(gòu)成:工作內(nèi)存,用于存放被引擎引用的數(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í)例。規(guī)則引擎的結(jié)構(gòu)示意圖如圖3所示。

          任何一個(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í)例因?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)的。

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

          BOM賦予規(guī)則行業(yè)特性

          業(yè)務(wù)規(guī)則一定是針對(duì)某種業(yè)務(wù)的,不同的業(yè)務(wù)有自己特有的業(yè)務(wù)模型——業(yè)務(wù)對(duì)象模型(Business Object Mode,簡(jiǎn)稱BOM)。BOM為業(yè)務(wù)規(guī)則語(yǔ)言提供了絕大多數(shù)的詞匯,多由業(yè)務(wù)系統(tǒng)分析員設(shè)計(jì),由開(kāi)發(fā)人員具體實(shí)現(xiàn)。從面向?qū)ο蟮木幊探嵌葋?lái)看,BOM就是一個(gè)簡(jiǎn)化的類圖,類圖中有類名、類的屬性、類的方法等。這些要素都將是業(yè)務(wù)規(guī)則語(yǔ)言中的基本“詞匯”。BOM的來(lái)源可以是Java對(duì)象模型、C++對(duì)象模型、XML Schema、Web服務(wù)定義等。

          假定我們有一個(gè)簡(jiǎn)單的寵物商店購(gòu)物車應(yīng)用程序,在這個(gè)應(yīng)用程序中,顧客能夠在購(gòu)物車中放入各種寵物和相關(guān)物品對(duì)象。這個(gè)應(yīng)用程序的業(yè)務(wù)對(duì)象集合就可以有ShoppingCart(購(gòu)物車)、Customer(用戶)、Item (條目)和ItemType(條目類型)這幾個(gè)類。

          表述業(yè)務(wù)規(guī)則的語(yǔ)法就是業(yè)務(wù)規(guī)則語(yǔ)言。由于規(guī)則語(yǔ)言的使用者主要有兩類:業(yè)務(wù)人員和技術(shù)人員,所以規(guī)則語(yǔ)言一般也分為兩類:“面向程序技術(shù)”的規(guī)則語(yǔ)言,它技術(shù)性很強(qiáng),可讀性較弱,比較適合IT 技術(shù)人員使用,一般每個(gè)規(guī)則引擎開(kāi)發(fā)商都有自己的一套“面向程序技術(shù)”的規(guī)則語(yǔ)言語(yǔ)法,不過(guò)OASIS組織定義了不同應(yīng)用情況下的規(guī)則語(yǔ)言規(guī)范,包括SRML(Simple Rule Markup Language),BMRL(Business Markup Rule Language)和RuleML(Rule Markup Language)等;“面向業(yè)務(wù)”的規(guī)則語(yǔ)言,它是業(yè)務(wù)人員使用的語(yǔ)言,必須具備非技術(shù)性和可定制性,通常它需要經(jīng)過(guò)“翻譯”之后才能被規(guī)則引擎解析。BRMS必須提供這種“翻譯”機(jī)制,而開(kāi)發(fā)人員要實(shí)現(xiàn)從“面向業(yè)務(wù)”規(guī)則語(yǔ)言到“面向程序”規(guī)則語(yǔ)言的映射。

          “面向業(yè)務(wù)”的規(guī)則語(yǔ)言無(wú)論從語(yǔ)法上還是語(yǔ)句結(jié)構(gòu)上都可能千變?nèi)f化,不同行業(yè)可能有自己的“行話”。一個(gè)好的BRMS應(yīng)該提供一個(gè)完善的規(guī)則語(yǔ)言框架,能夠迅速地為業(yè)務(wù)人員定制不同的“行話”,否則業(yè)務(wù)人員還是無(wú)法真正成為業(yè)務(wù)規(guī)則的主人。

          “單純”的規(guī)則如何互連?

          業(yè)務(wù)規(guī)則有一個(gè)非常明顯的特性:?jiǎn)渭冃浴C總€(gè)業(yè)務(wù)規(guī)則只描述自己特有的條件和滿足條件的操作,業(yè)務(wù)規(guī)則本身并不關(guān)心它與其他規(guī)則的關(guān)系,如優(yōu)先關(guān)系、互斥關(guān)系、包含關(guān)系等。每個(gè)業(yè)務(wù)規(guī)則本身可以有自己的屬性,稱元信息,可以用來(lái)處理規(guī)則之間相關(guān)性,例如引擎可以使用規(guī)則的優(yōu)先級(jí)來(lái)依序執(zhí)行規(guī)則的操作。

          有些BRMS還提供一種稱為“規(guī)則流”的定制功能。規(guī)則流是一個(gè)圖表,定義了解決問(wèn)題或執(zhí)行業(yè)務(wù)流程的順序。類似于統(tǒng)一建模語(yǔ)言(UML)的活動(dòng)圖,由一組任務(wù)以及定義這些任務(wù)之間執(zhí)行順序的轉(zhuǎn)換邏輯組成。一個(gè)轉(zhuǎn)換由條件控制,只有當(dāng)該限制條件為“真”時(shí)才能完成這種轉(zhuǎn)換。

          這些任務(wù)可以是規(guī)則任務(wù)、函數(shù)任務(wù)或子規(guī)則流任務(wù)。規(guī)則任務(wù)包含一組要作為任務(wù)主體執(zhí)行的規(guī)則,規(guī)則的執(zhí)行邏輯由用戶設(shè)置的任務(wù)屬性嚴(yán)格控制。這些屬性決定規(guī)則的排序、規(guī)則觸發(fā)策略、執(zhí)行算法等;函數(shù)任務(wù)包含要作為任務(wù)主體執(zhí)行的腳本代碼;子規(guī)則流任務(wù)則包含任務(wù)開(kāi)始后將依次執(zhí)行的子規(guī)則流。

          為了方便開(kāi)發(fā)人員和業(yè)務(wù)人員管理業(yè)務(wù)規(guī)則,BRMS必須提供具有直觀用戶界面的工具來(lái)實(shí)現(xiàn)業(yè)務(wù)規(guī)則管理。規(guī)則管理工具至少應(yīng)該具備以下功能:規(guī)則的定制和編輯、規(guī)則流的定制、決策表形式的規(guī)則定制、規(guī)則的查詢、規(guī)則有效期限的控制、規(guī)則的組織結(jié)構(gòu)、規(guī)則模板的定制、規(guī)則庫(kù)訪問(wèn)權(quán)限的控制、規(guī)則變更歷史的記錄、規(guī)則文檔的管理等。

          ·小資料2·

          業(yè)務(wù)規(guī)則管理系統(tǒng)其實(shí)是一組工具集,它包括:規(guī)則引擎、規(guī)則庫(kù)、規(guī)則語(yǔ)言框架、規(guī)則管理集成開(kāi)發(fā)環(huán)境。業(yè)務(wù)規(guī)則管理系統(tǒng)的基本工作原理如圖所示。

          規(guī)則引擎(Rules Engine)

          是執(zhí)行業(yè)務(wù)規(guī)則的軟件組件,它嵌入在程序中,是業(yè)務(wù)規(guī)則管理系統(tǒng)的核心元素。規(guī)則引擎的類型有:簡(jiǎn)單型、數(shù)據(jù)中心型和面向事務(wù)型。

          規(guī)則庫(kù)(Rules Repository)及其服務(wù)機(jī)制

          用于存儲(chǔ)規(guī)則和規(guī)則元數(shù)據(jù)(Meta Data)以及與規(guī)則有關(guān)的屬性。它提供一組工具用于存儲(chǔ)、分類、查詢、版本控制、權(quán)限控制、測(cè)試、提交等,規(guī)則的狀態(tài)和有效性可以跟蹤。規(guī)則庫(kù)可以依托文件系統(tǒng)或數(shù)據(jù)庫(kù)管理系統(tǒng)。

          規(guī)則語(yǔ)言框架(Rules Language Framework)

          規(guī)則語(yǔ)言一般分為兩類:“面向程序技術(shù)”的規(guī)則語(yǔ)言,使用者是技術(shù)人員;“面向業(yè)務(wù)”的規(guī)則語(yǔ)言,使用者是業(yè)務(wù)人員。規(guī)則語(yǔ)言框架則為定制“面向業(yè)務(wù)”的規(guī)則語(yǔ)言提供支持。

          規(guī)則管理工具(Rules Management Tool)

          用于管理、創(chuàng)建、修改和部署業(yè)務(wù)規(guī)則的圖形化工具,易用性強(qiáng),除了開(kāi)發(fā)人員外,業(yè)務(wù)人員也可以使用這套圖形化工具實(shí)現(xiàn)對(duì)規(guī)則的管理。

          規(guī)則集成開(kāi)發(fā)環(huán)境(Rules IDE)

          一般規(guī)則集成開(kāi)發(fā)環(huán)境只有規(guī)則編輯器,而高級(jí)的規(guī)則集成開(kāi)發(fā)環(huán)境可以實(shí)現(xiàn)對(duì)規(guī)則和規(guī)則庫(kù)的管理:如規(guī)則的創(chuàng)建、分類、檢索、修改、版本控制、權(quán)限管理等;甚至可以實(shí)現(xiàn)對(duì)多個(gè)規(guī)則引擎的“在線”調(diào)試;對(duì)規(guī)則集合進(jìn)行沖突檢查等。

          一個(gè)完整的BRMS應(yīng)該提供規(guī)則管理(Rules Management)、規(guī)則部署(ules Deployment)、規(guī)則分析(Rules Analysis)、規(guī)則定制和設(shè)計(jì)(Rules Design and Authoring)等功能。

          (計(jì)算機(jī)世界報(bào) 第14期 B6、B7)

          posted @ 2006-03-26 19:11 哈哈的日子 閱讀(1384) | 評(píng)論 (0)編輯 收藏
          Maven 在第一次運(yùn)行的時(shí)候會(huì)在網(wǎng)上下載一些 plugin ,可是找了好久都找不到在什么位置。

          而且我在安裝的 maven 中運(yùn)行,下載了一次,在 maven 的 eclipse plugin 中運(yùn)行又下載了一次,很是奇怪。
          尋找解決方法中……

          找到原因了,%MAVEN_HOME%/conf/settings.xml 文件中寫了位置,如下:

          <!-- localRepository
          | The path to the local repository maven will use to store artifacts.
          |
          | Default: ~/.m2/repository
          <localRepository>/path/to/local/repo</localRepository>
          -->

          因?yàn)閷?duì) maven 機(jī)制不熟悉,沒(méi)注意到這個(gè)。

          默認(rèn)存放的位置是你的 Document and Settings 下面用戶目錄的 .m2/repository 這個(gè)目錄下。

          也可以在這個(gè)地方配置。

          另外一個(gè)就是 maven 可以在 settings.xml 文件中配置代理服務(wù)器,以方便訪問(wèn) internet ,我在公司的時(shí)候就需要配置代理服務(wù)器才行。

          但是,現(xiàn)在還是不知道為什么要下載這么多的 plugin
          posted @ 2006-03-16 23:29 哈哈的日子 閱讀(3500) | 評(píng)論 (2)編輯 收藏
          從他們的 MVC 模型上面看,請(qǐng)求轉(zhuǎn)發(fā)的模型基本一致。
          性能的區(qū)別我覺(jué)得主要在 View 這一層上。

          Struts 將 JavaBean 轉(zhuǎn)至 JSP 頁(yè)面,來(lái)處理頁(yè)面顯示,比較直接,而 Struts 本身也是關(guān)注的是 MVC 的分離,在頁(yè)面處理方面并沒(méi)有給予過(guò)多的關(guān)注。直接的顯示讓 Struts 在 View 層的性能有比較好的表現(xiàn)。

          而 JSF 在 View 這一層:一、需要維護(hù)組件樹(shù)的狀態(tài)。二、需要使用渲染器來(lái)將組件渲染。性能就會(huì)比 Struts 差一些。


          從生命周期的角度上來(lái)看

          Struts 請(qǐng)求的基本周期是。經(jīng)過(guò) front servlet 的請(qǐng)求分發(fā),然后生成 command 對(duì)象,由 action 調(diào)用 Model 直至轉(zhuǎn)向 View。

          JSF 的基本周期是,經(jīng)過(guò) front servlet 請(qǐng)求分發(fā)(這一步同 struts),然后 restore view , apply request value, process validations , update model 這些生命周期相當(dāng)于 struts 生成 command 對(duì)象階段,invoke application 相當(dāng)于調(diào)用 model ,render response 相當(dāng)于轉(zhuǎn)向 view 階段。

          對(duì)比來(lái)看,請(qǐng)求分發(fā)階段不會(huì)產(chǎn)生更多的性能差異,然后對(duì)比其它階段
          struts 生成 command 對(duì)象階段包含 conversion 和部分 validation ,相當(dāng)于 JSF 的 apply request value 和 process validations 階段,但 JSF 還需要 restore view 和 update model(保持 Managed Bean 的狀態(tài)),性能會(huì)差一點(diǎn),但要補(bǔ)充的是 restore view 在 myfaces 的實(shí)現(xiàn)中,會(huì)將 view 對(duì)象放在客戶端保存(好象可以配置不保存),下一次請(qǐng)求如果有 view 對(duì)象,會(huì)直接反序列化得到 view root ,相當(dāng)于在客戶端 cache了,而 update model 只會(huì)在部分與數(shù)據(jù)相關(guān)的組件會(huì)使用。最后的 invoke application 與 struts 的調(diào)用 action ,然后 lifecycle 中的 render response 階段會(huì)找到對(duì)應(yīng)的 view 并轉(zhuǎn)向,然后由頁(yè)面的 tag 調(diào)用 render 來(lái)渲染出頁(yè)面。最后調(diào)用 tag 渲染頁(yè)面階段相當(dāng)于 struts 的前臺(tái)顯示,但由于更大粒度和更精細(xì)的渲染,在這個(gè)階段會(huì)與 struts 有一定的性能差。

          總體來(lái)說(shuō),JSF 使用了大量的 cache 手段,盡量減少一些性能開(kāi)銷,但比 struts 增強(qiáng)的 backing bean 管理、事件處理能力和豐富的組件能力會(huì)讓 JSF 在生命周期性能上比 struts 略遜一籌。

          但這并不是所有的應(yīng)用場(chǎng)景性能上都要比 struts 差,比如:同樣是后臺(tái)數(shù)據(jù)驗(yàn)證的情況下,JSF 在驗(yàn)證錯(cuò)誤時(shí)立即會(huì)返回用戶頁(yè)面,而沒(méi)有經(jīng)驗(yàn)其它生命周期,可 struts 還是一樣會(huì)走完全部生命周期,這種情況 JSF 就會(huì)達(dá)到比 struts 更好的性能。

          瑕不掩瑜,性能上部分的劣勢(shì)并不能掩蓋 JSF 強(qiáng)大的功能和為我們省下的大量的時(shí)間,我相信 JSF 肯定會(huì)在將來(lái)的開(kāi)發(fā)中得到更多開(kāi)發(fā)者的青睞。

          posted @ 2006-03-07 23:22 哈哈的日子 閱讀(2286) | 評(píng)論 (1)編輯 收藏
            知道有java這個(gè)東西,是一年前的事。呵呵,不要誤會(huì),我不是剛接觸電腦的小孩,過(guò)了年,我就是26歲了。
            知道java,是因?yàn)槲矣袀€(gè)傻瓜老公,他會(huì)這個(gè)。
            幾天前,他告訴我買了個(gè)網(wǎng)址(不要挑剔我的用詞,外行不是我一個(gè)人的錯(cuò)),把他的blog連到那上面去。看他天天回家就“抱”著電腦,嘴角還傻傻地向上翹,我就納悶呀,blog我也知道,不就是一些悶騷的人說(shuō)一些感性在先理性在后的話嗎?至于置我這個(gè)“掌門”于不顧嗎?趁他起身如廁之際,我急忙跑到電腦前,探個(gè)究竟。
            BlogJava?
                  就是這個(gè)東東呀!
            恍然大悟,然后撓頭,累不累呀!
            他在華為做研發(fā),每天就用這個(gè)什么Java干活。華為那個(gè)可憎的XX公司,老總是個(gè)典型的資本家,天天要加班到很晚(九、十點(diǎn)鐘是正常),而且每四個(gè)星期還要有一個(gè)星期六義務(wù)奉獻(xiàn)。動(dòng)輒罰款降薪,而且還要連帶你的上司一同受懲!置《勞動(dòng)法》于不顧,大大的壞!!可是為什么這樣的辛苦,休息的時(shí)候還弄這個(gè)鬼鬼Java呀?哎呀,男人心,海底針呀!
            我就在這個(gè)Blog上逛了逛,哦,這樣的人還真不少啊!難怪這家伙像看到親人了似的。
            呵,呵呵,簡(jiǎn)單的瀏覽之后,我確定這里有多個(gè)我老公的copy版。每天起來(lái)做的第一件事就是打開(kāi)信箱收發(fā)郵件;電腦桌面要簡(jiǎn)單,源文件里密密麻麻的才叫“眩”;上廁所雙擊開(kāi)關(guān),坐在馬桶上用《程序員》來(lái)打發(fā)時(shí)間。
            不過(guò)我現(xiàn)在不會(huì)再抱怨了,雖然他依然聽(tīng)不見(jiàn)我的問(wèn)話,即使我站在電腦旁邊。我知道這是他唯一的心血,唯一的愛(ài)好,唯一的執(zhí)著,唯一的事業(yè),那么,我為什么不支持呢?
            現(xiàn)在的我還是不懂得什么是Java,但是我驕傲,因?yàn)槔瞎莻€(gè)出色的“程序員”。他不理我并不是我的魅力不及電腦,不然怎么會(huì)把所有的薪水花在我這邊?沒(méi)有時(shí)間理我,算了。因?yàn)槲乙矝](méi)有那么多時(shí)間,我要收拾房間,搞好個(gè)人和“他”人衛(wèi)生,還要花大量時(shí)間研究營(yíng)養(yǎng)學(xué),都說(shuō)長(zhǎng)久用電腦的人要多多補(bǔ)充的!
            祝愿所有用Java賺錢的人身體健康,一生平安!
            

            
            
            
          posted @ 2006-03-03 10:33 哈哈的日子 閱讀(1215) | 評(píng)論 (17)編輯 收藏
          僅僅是跑了 myfaces 的 example ,我已經(jīng)被 JSF 的強(qiáng)大所打動(dòng)。
          myfaces 對(duì) JSF 的 component 有著非常多的擴(kuò)展,其中主要有 dataTable 、navigation 和 tree 。
          其中比較吸引人的還有 js listener、panelTable 等一些很“眩”的特性。

          JSF+AJAX 肯定是既能提高用戶體驗(yàn)又能大大降低開(kāi)發(fā)維護(hù)難度的一個(gè)很好的中間點(diǎn)。
          在集成 AJAX 方面 ajaxanywhere 可以很容易的和 JSF 集成起來(lái),效果也非常不錯(cuò)。是一個(gè)主要的研究方向,其它的嘗試并不多,試了一下 DWR ,效果很不好,基本放棄。

          推薦一篇文章
          http://wiki.apache.org/myfaces/Integrating_Ajaxanywhere
          posted @ 2006-03-01 22:26 哈哈的日子 閱讀(634) | 評(píng)論 (0)編輯 收藏
          終于想認(rèn)認(rèn)真真的寫點(diǎn)東西了,讓自己也有點(diǎn)回憶,于是就找到了這個(gè)地方。
          還和老婆為樣式爭(zhēng)吵了半天,最終嘛,還是聽(tīng)了我的,就用這個(gè)比較簡(jiǎn)單的吧。
          老婆不知道受了什么刺激,拿了本 DW 的書自己學(xué)做網(wǎng)頁(yè)去了,hoho。她人就這樣,直來(lái)直去的,看到別人弄什么,自己就想弄,小孩子脾氣。
          希望將來(lái)幸福快樂(lè)的日子更多!
          posted @ 2006-02-27 21:25 哈哈的日子 閱讀(239) | 評(píng)論 (0)編輯 收藏
          僅列出標(biāo)題
          共17頁(yè): First 上一頁(yè) 9 10 11 12 13 14 15 16 17 
          主站蜘蛛池模板: 房山区| 专栏| 教育| 天镇县| 五大连池市| 腾冲县| 龙胜| 宁海县| 黄大仙区| 荥经县| 逊克县| 台南县| 昌邑市| 濮阳县| 宜兰县| 哈巴河县| 龙山县| 顺平县| 池州市| 吉安市| 襄樊市| 绥德县| 靖州| 布拖县| 克拉玛依市| 行唐县| 兴和县| 辽中县| 天津市| 隆子县| 县级市| 曲松县| 慈溪市| 汶川县| 大城县| 卢氏县| 乌审旗| 芦溪县| 寿光市| 汶川县| 盈江县|