王重英
摘 要:工作流系統(tǒng)是企業(yè)業(yè)務(wù)流程實(shí)現(xiàn)自動(dòng)化的一項(xiàng)重要技術(shù)。它具有提高企業(yè)運(yùn)營(yíng)效率,改善企業(yè)資源利用,提高企業(yè)運(yùn)作的靈活性和適應(yīng)性等諸多優(yōu)點(diǎn)。然而,傳統(tǒng)的工作流系統(tǒng)在復(fù)雜多變的企業(yè)業(yè)務(wù)流程中存在很多不足。據(jù)此提出一種基于規(guī)則引擎的工作流系統(tǒng)模型。通過(guò)規(guī)則引擎的應(yīng)用,有效地把業(yè)務(wù)規(guī)則與基本技術(shù)實(shí)現(xiàn)分離,提高了系統(tǒng)的適應(yīng)性和靈活性。最后,結(jié)合電信公司資費(fèi)優(yōu)惠套餐計(jì)劃,利用Drools設(shè)計(jì)出基于XML的業(yè)務(wù)規(guī)則。
關(guān)鍵詞:工作流;RBES;規(guī)則引擎;Drools
中圖分類(lèi)號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:B
文章編號(hào):1004-373X(2009)12-042-03
Design of General Application Framework of Workflow Based on Rule Engineer
WANG Chongying
(Shangluo Institute,Shangluo,726000,China)
Abstract:Worlflow is one of important technologies in enterprise business process automation.It has many advantages such as raising efficiency of business operation,improving use of resourse,increasing flexibility and adaptability of business executation and so on.The lack of workflow system in complex enterprise business is analyzed,a workflow system model based on rule engine is put forword to enhance the flexibility of the system.Rule based on xml with Drools by applying the preferential polices of conmunication expenses about telecommunication company is presented.
Keywords:workflow;RBES;rule engine;Drools
0 引 言
工作流管理通過(guò)對(duì)企業(yè)業(yè)務(wù)過(guò)程中的內(nèi)在邏輯關(guān)系進(jìn)行建模,并提供相關(guān)的運(yùn)行環(huán)境,實(shí)現(xiàn)企業(yè)業(yè)務(wù)過(guò)程重組、過(guò)程管理與過(guò)程自動(dòng)化。由于現(xiàn)實(shí)生活中企業(yè)業(yè)務(wù)規(guī)則在時(shí)間、因果等關(guān)系上的靈活性和不確定性,實(shí)現(xiàn)有效工作流管理的一個(gè)關(guān)鍵問(wèn)題是提高工作流管理系統(tǒng)的適應(yīng)性。如今,在許多基于Web的應(yīng)用領(lǐng)域中,都存在著對(duì)推理引擎的需求,如基于Web的專(zhuān)家系統(tǒng)、聯(lián)機(jī)分析系統(tǒng)、數(shù)據(jù)挖掘系統(tǒng)、智能搜索引擎等。如果能夠開(kāi)發(fā)一個(gè)開(kāi)放的、對(duì)象化的、基于Web的推理引擎,勢(shì)必會(huì)節(jié)省大量的重復(fù)開(kāi)發(fā)工作,從而促進(jìn)基于Web的智能軟件開(kāi)發(fā)及發(fā)展。這里設(shè)計(jì)一種基于Java規(guī)則引擎(Rules Engine)的工作流框架。
1 基于規(guī)則的專(zhuān)家系統(tǒng)(RBES)
規(guī)則引擎則是基于規(guī)則的專(zhuān)家系統(tǒng)的一部分。為了更深入地了解Java規(guī)則引擎,下面簡(jiǎn)要地介紹基于規(guī)則的專(zhuān)家系統(tǒng)(RBES)[1]。RBES包括3部分:Rule Base(Knowledge Base),Working Memory(Fact Base)和Rule Engine(推理引擎),其結(jié)構(gòu)如圖1所示。
圖1中,推理引擎包括3部分:模式匹配器(Pattern Matcher),議程(Agenda)和執(zhí)行引擎(Execution Engine)。推理引擎通過(guò)決定哪些規(guī)則滿(mǎn)足事實(shí)或目標(biāo),并授予規(guī)則優(yōu)先級(jí),滿(mǎn)足事實(shí)或目標(biāo)的規(guī)則被加入議程。模式匹配器決定選擇執(zhí)行哪個(gè)規(guī)則,何時(shí)執(zhí)行規(guī)則;議程管理模式匹配器挑選規(guī)則的執(zhí)行次序;執(zhí)行引擎負(fù)責(zé)執(zhí)行規(guī)則和其他動(dòng)作。與人類(lèi)的思維相對(duì)應(yīng),規(guī)則引擎存在兩種推理方式:演繹法(Forward-Chaining)和歸納法(Backward-Chaining)。演繹法從一個(gè)初始的事實(shí)出發(fā),不斷地應(yīng)用規(guī)則得出結(jié)論(或執(zhí)行指定的動(dòng)作);歸納法從假設(shè)出發(fā),不斷尋找符合假設(shè)的事實(shí)。
圖1 基于規(guī)則的專(zhuān)家系統(tǒng)結(jié)構(gòu)圖
Rete算法[2]是目前效率最高的一個(gè)Forward-Chaining推理算法,絕大多數(shù)Java的推理引擎都采用這一算法。規(guī)則引擎的推理步驟:
(1) 將初始數(shù)據(jù)(Fact)輸入工作內(nèi)存;
(2) 使用模式匹配器比較規(guī)則(Rule)和數(shù)據(jù)(Fact);
(3) 如果執(zhí)行規(guī)則存在沖突(Conflict),即同時(shí)激活多個(gè)規(guī)則,將沖突的規(guī)則放入沖突集合;
(4) 解決沖突,將激活的規(guī)則按順序放入議程;
(5) 使用規(guī)則引擎執(zhí)行議程中的規(guī)則。重復(fù)步驟(2)~(5),直到執(zhí)行完所有議程中的規(guī)則。
2 Java Rule Engine API規(guī)范(JSR-94)
2003年11月,Java社區(qū)通過(guò)了Java Rule Engine API規(guī)范(JSR-94)的最后草案。它是由javax.rules包定義,是訪(fǎng)問(wèn)規(guī)則引擎的標(biāo)準(zhǔn)企業(yè)級(jí)API。Java規(guī)則引擎API允許客戶(hù)程序使用統(tǒng)一的方式和不同廠(chǎng)商的規(guī)則引擎產(chǎn)品交互,就像使用JDBC編寫(xiě)?yīng)毩⒂趶S(chǎng)商訪(fǎng)問(wèn)不同的數(shù)據(jù)庫(kù)產(chǎn)品一樣。Java規(guī)則引擎API包括創(chuàng)建和管理規(guī)則集合的機(jī)制,在Working Memory中添加、刪除和修改對(duì)象的機(jī)制,以及初始化、重置和執(zhí)行規(guī)則引擎的機(jī)制[3]。圖2給出基于規(guī)則引擎 的工作流管理系統(tǒng)。
圖2 基于規(guī)則引擎的工作流管理系統(tǒng)
3 基于Java規(guī)則推理的工作流應(yīng)用框架
3.1 工作流應(yīng)用框架
按照WFMC的定義[4],工作流的概念被概括為“業(yè)務(wù)過(guò)程的部分或全部在計(jì)算機(jī)應(yīng)用環(huán)境下的自動(dòng)化”,它所要解決的主要問(wèn)題是“在多個(gè)參與者之間按照某種預(yù)定義的規(guī)則傳遞文檔、信息或使任務(wù)的過(guò)程自動(dòng)進(jìn)行”, 從而實(shí)現(xiàn)某個(gè)預(yù)期的業(yè)務(wù)目標(biāo),或者是促使該目標(biāo)實(shí)現(xiàn)。該工作流應(yīng)用框架采用面向?qū)ο蟮姆椒ê徒M件化的架構(gòu)設(shè)計(jì),系統(tǒng)采用組件模型和Java編程技術(shù),并完全基于J2EE平臺(tái)的規(guī)范設(shè)計(jì)和構(gòu)建。該工作流平臺(tái)的核心模塊是工作流引擎。工作流引擎包括3個(gè)核心組件:工作流對(duì)象、工作流路由器和規(guī)則引擎。1個(gè)工作流實(shí)例由一組相關(guān)的工作流對(duì)象代表。工作流對(duì)象中封裝了工作流的相關(guān)數(shù)據(jù),每一個(gè)工作流對(duì)象都有1個(gè)關(guān)聯(lián)的應(yīng)用對(duì)象,應(yīng)用對(duì)象中封裝了相關(guān)的應(yīng)用數(shù)據(jù)[5]。
工作流路由器是工作流引擎的心臟,其功能是推進(jìn)工作流實(shí)例執(zhí)行。工作流路由器把每個(gè)工作流對(duì)象在合適的時(shí)間傳遞到合適的隊(duì)列中。規(guī)則引擎是工作流引擎的大腦,其功能是根據(jù)已經(jīng)定義好的工作流規(guī)則,一個(gè)工作流對(duì)象以及與它關(guān)聯(lián)的應(yīng)用對(duì)象當(dāng)前所處的狀態(tài),決定這個(gè)工作流對(duì)象的下一個(gè)隊(duì)列[6],該規(guī)則引擎引入了一個(gè)基于Rete算法的Java規(guī)則引擎。
圖3所示是工作流對(duì)象、工作流路由器、規(guī)則引擎、應(yīng)用對(duì)象和應(yīng)用程序之間的關(guān)系。應(yīng)用對(duì)象與工作流對(duì)象之間的關(guān)聯(lián)是在創(chuàng)建工作流對(duì)象時(shí)動(dòng)態(tài)建立的。工作流路由器僅傳遞工作流對(duì)象,不涉及與工作流對(duì)象關(guān)聯(lián)的應(yīng)用對(duì)象。應(yīng)用程序只是對(duì)應(yīng)用對(duì)象進(jìn)行操作,與工作流對(duì)象無(wú)關(guān)。這是該工作流引擎保持其通用性的關(guān)鍵,規(guī)則引擎提供的動(dòng)態(tài)綁定功能,進(jìn)一步增加了工作流引擎的靈活性[7]。
圖3 工作流相關(guān)關(guān)系圖
3.2 Drools開(kāi)源項(xiàng)目
目前,支持JSR-94規(guī)范的產(chǎn)品中最為成熟且又免費(fèi)的是Drools[8]。Drools是一個(gè)Bob McWhirter開(kāi)發(fā)的開(kāi)源項(xiàng)目。Rete算法可實(shí)現(xiàn)一個(gè)增強(qiáng)的Java語(yǔ)言。Drools利用XML和Java就可以實(shí)現(xiàn)規(guī)則引擎的強(qiáng)大功能,具有很好的應(yīng)用前景,目前已發(fā)表了2.0-beata-14版。Drools提供了3種語(yǔ)義模塊——Python模塊、Java模塊和Groovy模塊。Drools項(xiàng)目的規(guī)則文件為自定義格式,由一個(gè)XML語(yǔ)言定義的基本語(yǔ)義模塊加上Java(Groovy或Phython)語(yǔ)義模塊組成。開(kāi)發(fā)者也可以根據(jù)需要定制自己專(zhuān)用的語(yǔ)義模塊。每一個(gè)規(guī)則文件包括一個(gè)惟一的規(guī)則集,規(guī)則集包括一個(gè)或多個(gè)規(guī)則,每個(gè)規(guī)則包括一個(gè)或多個(gè)參數(shù)。這些參數(shù)用于在規(guī)則的條件中進(jìn)行判斷和執(zhí)行相應(yīng)的操作,參數(shù)對(duì)應(yīng)的是一個(gè)Java類(lèi),Drools會(huì)在創(chuàng)建工作內(nèi)存的時(shí)候把它自動(dòng)實(shí)例化,每個(gè)規(guī)則包括一或多個(gè)條件以及一個(gè)最后的操作。
下面通過(guò)一個(gè)簡(jiǎn)化的電信資費(fèi)優(yōu)惠處理模型,說(shuō)明Drools在實(shí)際中的應(yīng)用。
電信公司為了吸引顧客,經(jīng)常會(huì)推出各種資費(fèi)優(yōu)惠套餐計(jì)劃,這些優(yōu)惠措施包括打折、固定折扣(消費(fèi)滿(mǎn)一定額度返還一部分固定費(fèi)用)等?,F(xiàn)假設(shè)存在以下優(yōu)惠規(guī)則:
(1) 長(zhǎng)話(huà)費(fèi)超過(guò)200元的用戶(hù),超出部分長(zhǎng)話(huà)費(fèi)優(yōu)惠20%;
(2) 上網(wǎng)費(fèi)超過(guò)200元的用戶(hù),市話(huà)費(fèi)減免50%,但最多減免50元。
即使就這么2條簡(jiǎn)單的規(guī)則,如果直接編程實(shí)現(xiàn)也將是一大堆if語(yǔ)句,既不容易實(shí)現(xiàn),更難以維護(hù),利用Drools可實(shí)現(xiàn)這些規(guī)則。相應(yīng)的規(guī)則文件charge.java.drl具體內(nèi)容如下[9]:
Integerdis=newInteger((a.getPrimCharge("chf")-200)*(-0.2));
a.addDisc("discount1",dis);
Int idis=a.getPrimCharge("shf")*0.5;
if(idis>50)idis=-50;
else idis=-idis;
a.addDisc("discount2",new Integer(idis));
[10]
最后調(diào)用這些規(guī)則,生成的代碼非常簡(jiǎn)單。
4 結(jié) 語(yǔ)
從前面的討論可看出,采用開(kāi)源項(xiàng)目Drools 規(guī)則引擎,能夠有效地分離業(yè)務(wù)規(guī)則與基本技術(shù),對(duì)業(yè)務(wù)規(guī)則的改變只需改變XML文件而不需要修改工作流引擎,從而為工作流管理系統(tǒng)處理商業(yè)復(fù)雜多變的業(yè)務(wù)規(guī)則提供了一種解決方案。可以預(yù)見(jiàn),隨著Java規(guī)則引擎工具的不斷成熟,這一技術(shù)必將被越來(lái)越廣泛的應(yīng)用,成為解決實(shí)際工程中復(fù)雜業(yè)務(wù)規(guī)則問(wèn)題的有力工具。
參考文獻(xiàn)
[1]N.Alex Rupp.A Intruduction to The Drools Project[A].http://www.theserverside.com/tt/articles/article.tss?l=Drools,2004.
[2]郭芳,白建軍.基于Rete算法的規(guī)則引擎JBoss Rules[J].計(jì)算機(jī)時(shí)代,2008(1):12-14.
[3]張宇,陳德禮.Drools規(guī)則引擎應(yīng)用分析[J].福建電腦,2007(10):15-16.
[4]范玉順.工作流管理技術(shù)基礎(chǔ)實(shí)現(xiàn)企業(yè)業(yè)務(wù)重組、過(guò)程管理與過(guò)程自動(dòng)化的核心技術(shù)[M].北京:清華大學(xué)出版社,2001.
[5]鄔少飛.Service-based Flexible Workflow System for Virtual Enterprise[J].Journal of Chongqing University:English Edition,2008,3:73-76.
[6]Zhang Ye,Zhe Jiang.A Technical Support to Integrated Logistics Strategytr Ansform: Distributed Workflow Management System[A].第十四屆工業(yè)工程與工程管理國(guó)際會(huì)議[C].2007.
[7]Wil.工作流管理模型、方法和系統(tǒng)[M].王建民,譯.北京:清華大學(xué)出版社,2004.
[8]朱先飛.Drools在電信網(wǎng)絡(luò)開(kāi)通系統(tǒng)中的應(yīng)用及其改造[J].廣東通信技術(shù),2007(11):10-12.
[9]任忠保,張艷晶,李立亞.基于Drools的策略體系設(shè)計(jì)[J].計(jì)算機(jī)安全,2007(8):64-66.
[10]張淵,夏清國(guó).基于Rete算法的Java規(guī)則引擎[J].科學(xué)技術(shù)與工程,2006(6):94-96.