張德育,張 倩
(沈陽理工大學(xué)通信與網(wǎng)絡(luò)工程中心,遼寧沈陽110159)
隨著IT技術(shù)的發(fā)展,面向服務(wù)的架構(gòu)(service-oriented architecture,SOA)已經(jīng)成為新一代的基礎(chǔ)架構(gòu)。在SOA架構(gòu)中服務(wù)以可被發(fā)現(xiàn)的接口形式發(fā)布于網(wǎng)絡(luò)中,并且通過這些接口為使用者提供服務(wù)。服務(wù)組合作為實現(xiàn)SOA系統(tǒng)架構(gòu)的重要特征,其實現(xiàn)方法的研究尤為重要。其中,服務(wù)組合是指由各個小粒度的Web服務(wù)相互之間通信和協(xié)作來實現(xiàn)大粒度的服務(wù)功能;通過有效地聯(lián)合各種不同功能的Web服務(wù),服務(wù)開發(fā)者可以借此解決較為復(fù)雜的問題,實現(xiàn)增值功能。當(dāng)前關(guān)于服務(wù)組合的研究大致分為兩個方向:一個是基于智能規(guī)劃,代表性工作是斯坦福大學(xué)和卡內(nèi)基-梅隆大學(xué)等機構(gòu)提出的Web服務(wù)本體語言(Ontology Web Language for Services,OWL-S)[1];另一個方向是基于工作流組合,以BEA系統(tǒng)公司、IBM和微軟等提出的業(yè)務(wù)流程執(zhí)行語言(Business Process Execution Language for Web Services,BPEL4WS)為代表[2]。OWL-S 描述的是各個服務(wù)的外部信息間的交互,使用本體概念對Web服務(wù)的語義進行表示,而概念間的推理則依靠描述邏輯來實現(xiàn)。雖然OWL-S有許多優(yōu)越性,但是在目前的Web框架下,很難得到廣泛的使用,它只有在全部都是語義描述的理想狀況下才能發(fā)揮最大的功效。BPEL(BPEL4WS后被更名為WS-BPEL,簡稱BPEL)是IBM 的WSFL和微軟的XLANG相結(jié)合的產(chǎn)物,是一種高級的、抽象的、可執(zhí)行建模語言,它不僅實現(xiàn)Web服務(wù)間的交互和流程編排,也將流程自身暴露為Web服務(wù)。同時,BPEL是基于工作流的組合方法的經(jīng)典代表,它可以與經(jīng)典工作流建模方法相結(jié)合,充分吸收工作流技術(shù)的一些優(yōu)勢,從而使實現(xiàn)的服務(wù)組合有效、便捷且易于理解。因此,本文采用基于工作流的服務(wù)組合技術(shù),在對BPEL進行深入研究的基礎(chǔ)上,設(shè)計了一種基于BPEL的服務(wù)組合方法,并進行了驗證,從而解決SOA中的服務(wù)組合方法的服務(wù)編排問題。
SOA是以服務(wù)為基礎(chǔ)搭建的、松耦合的、靈活的體系架構(gòu)[3]。SOA的核心是重用和互操作,它可以把不同區(qū)域不同機構(gòu)的IT資源整合成可操作的、基于標(biāo)準(zhǔn)的服務(wù)。在SOA中,通過服務(wù)接口,可以用一個服務(wù)替換另一個服務(wù)而無需關(guān)心其底層的實現(xiàn)技術(shù);通過通用的服務(wù)和XML標(biāo)準(zhǔn),可以將遺留應(yīng)用和數(shù)據(jù)納入新系統(tǒng)。如圖1所示,SOA可大致分為三個部分:服務(wù)組件架構(gòu)(Service Component Architecture,SCA)、服務(wù)數(shù)據(jù)對象(Service Data Object,SDO)和服務(wù)編排(BPEL)。SCA是一個與實現(xiàn)語言無關(guān)的服務(wù)組件編程模型,用于定義服務(wù),是構(gòu)建SOA的基礎(chǔ);SDO作為以對象為中心的層次數(shù)據(jù)模型,用于表示SOA的服務(wù)中流轉(zhuǎn)的數(shù)據(jù);BPEL是服務(wù)編排的核心技術(shù),同時也是具體業(yè)務(wù)流程的表現(xiàn)。作為SOA編程模式的“鐵三角”之一,對BPEL的研究不可或缺。
圖1 SOA模式的鐵三角
工作流這個概念產(chǎn)生于生產(chǎn)組織和辦公自動化領(lǐng)域。工作流是一類能夠完成或者部分自動執(zhí)行的經(jīng)營過程,它根據(jù)一系列過程規(guī)則、文檔、信息或任務(wù)能夠在不同的執(zhí)行者之間進行傳遞和執(zhí)行?;诠ぷ髁鞯姆?wù)組合方法采用過程驅(qū)動的服務(wù)組合思想,它利用服務(wù)組合與過程模型的相似性,使用較為成熟的過程建模工具和語言對Web服務(wù)組合的業(yè)務(wù)進行建模,采用“替代”法將過程模型中的相關(guān)組件最終替換成具體的Web服務(wù),從而獲得有效的、可執(zhí)行的服務(wù)組合方案。
BPEL是較為成熟的過程建模語言中的一種,作為基于XML定義的描述語言,它的協(xié)議基礎(chǔ)是:WSDL1.1、XML Schema1.0 和 XPath1.0。其中,WSDL消息和XML Schema類型定義提供了BPEL流程所用的數(shù)據(jù)模型;XPath提供數(shù)據(jù)處理支持,所有的外部資源由WSDL服務(wù)表示。這些都是BPEL定義業(yè)務(wù)流程的基礎(chǔ)。也正是因為涉及較多的協(xié)議基礎(chǔ),目前大部分研究者都回避BPEL而采用“迂回的方式”進行建模,如Petri網(wǎng)。但是,BPEL作為專為整合Web服務(wù)而制定的規(guī)范標(biāo)準(zhǔn)[4],因其具有基于服務(wù)、嵌套性、松耦合型、服務(wù)質(zhì)量和生命周期的管理等特點,基于BPEL的服務(wù)組合可以很好地滿足SOA松耦合和異構(gòu)的要求,并且是敏捷的。此外,使用BPEL建模得到的流程清晰易懂,這些都足以成為深入研究BPEL技術(shù)標(biāo)準(zhǔn)的動力。
基于BPEL的服務(wù)組合方法可歸納為兩個部分:一是為工作流中的每個活動設(shè)定一個抽象服務(wù),形成抽象服務(wù)流程定義;二是執(zhí)行前通過中間環(huán)節(jié)進行服務(wù)匹配和綁定,將每個抽象服務(wù)替換成一個實體服務(wù),將抽象服務(wù)流轉(zhuǎn)換成實際的服務(wù)組合方法,此部分是整個方法實現(xiàn)的核心,也是本文研究的重點。
在進行業(yè)務(wù)流程定義之前,要先定義業(yè)務(wù)流程所需要的資源。這些資源主要包括:擴展定義,它將列舉業(yè)務(wù)流程所需要使用的擴展定義的命名空間以及該擴展是否必須被BPEL引擎支持;引入外部定義文件,通過import將BPEL所需的可能定義在外部的WSDL文件或XML Schema文件中的接口定義,伙伴鏈接類型定義,變量定義,用于關(guān)聯(lián)集合的屬性別名等引入流程定義;伙伴,指明業(yè)務(wù)流程對外提供的接口,以及因調(diào)用其服務(wù)所需要引用的接口;變量,存儲業(yè)務(wù)流程的中間狀態(tài),使得一系列無狀態(tài)的Web服務(wù)調(diào)用成為有狀態(tài)的業(yè)務(wù)流程;關(guān)聯(lián)集合,確定返回的消息路由到正確的流程實例。
當(dāng)所需資源準(zhǔn)備好后,著重分析該業(yè)務(wù)流程本身的活動?;顒幼鳛锽PEL業(yè)務(wù)流程的執(zhí)行單元,分為基本活動和結(jié)構(gòu)化活動。基本活動具有原子性,它定義業(yè)務(wù)流程的一些基本操作,例如事件的接收,變量的賦值,服務(wù)調(diào)用等。而結(jié)構(gòu)化活動可以看作是活動的容器,它定義了內(nèi)部活動的規(guī)則,如flow活動使其內(nèi)部的活動并行執(zhí)行。
另外,BPEL還可以通過流程處理器提高所提供的服務(wù)質(zhì)量。流程處理器包括錯誤處理器(Fault Handlers)、補償處理器(Compensation Handlers)和事件處理器(Event Handling)[5]。它們可以定義在活動上,指出活動發(fā)生錯誤、需要補償或是特定事件發(fā)生時需要的處理邏輯。錯誤處理器將捕獲流程級別的錯誤并進行相應(yīng)的處理,使錯誤處理邏輯和正常的業(yè)務(wù)流程邏輯分開。補償處理器只是包含了一個需要執(zhí)行的補償邏輯的活動。事件處理器為BPEL流程提供了接受并處理隨機事件的能力,這里的事件可以是消息事件,也可以是時鐘事件,即某個預(yù)定的時刻到達或預(yù)定的事件長度得到滿足而發(fā)生的事件。
基于前文對BPEL技術(shù)的分析,下面以區(qū)域醫(yī)療平臺中藥品采購服務(wù)為例來說明實現(xiàn)該業(yè)務(wù)的基于BPEL的服務(wù)組合方法。藥品采購服務(wù)是醫(yī)療機構(gòu)內(nèi)部各部門先提交藥品采購單,由藥品采購負責(zé)人進行人工審批,審批合格后生成藥品信息統(tǒng)計并通過省網(wǎng)采購系統(tǒng)進行藥品采購,否則該提交者對采購單進行修改,然后再提交,具體流程如圖2所示。由以上分析知道藥品采購服務(wù)是由采購單提交服務(wù)、采購單取消服務(wù)、人工審批服務(wù)、采購單信息統(tǒng)計服務(wù)根據(jù)業(yè)務(wù)需求整合而成,而這些服務(wù)作為現(xiàn)有服務(wù)發(fā)布,并生成BPEL可以調(diào)用的相應(yīng)的wsdl文件,即采購單提交服務(wù)PurchaseApply.wsdl、人工審批服務(wù)TaskManager.wsdl、采購單取消服務(wù) PurchaseCancle.wsdl、采購單信息統(tǒng)計服務(wù)Pstatistics.wsdl。下面將具體說明如何把這些服務(wù)抽象到BPEL流程中,并通過該BPEL流程的運行,調(diào)用相關(guān)服務(wù)來完成藥品采購服務(wù)。
在進行建模之前要先確定整個業(yè)務(wù)流程的骨架,本文經(jīng)過對多個業(yè)務(wù)需求研究,抽象出兩種基本業(yè)務(wù)流程執(zhí)行模式。簡單的業(yè)務(wù)由其中一種構(gòu)成,復(fù)雜的業(yè)務(wù)大都由這兩種模式混合構(gòu)成。
圖2 業(yè)務(wù)流程圖
1)串行模式按照順序執(zhí)行各項活動,第一個活動執(zhí)行結(jié)束才能開始執(zhí)行第二個活動,以此類推,直到最后一個活動執(zhí)行結(jié)束,整個流程結(jié)束,如圖3所示。
圖3 串行模式
2)并行模式該模式中所有執(zhí)行單元將同時開始執(zhí)行,并可以通過設(shè)置條件來決定它們的結(jié)束是否需要同步,如圖4所示。
圖4 并行模式
在本例中由業(yè)務(wù)流程圖可知,該業(yè)務(wù)流程執(zhí)行模式由兩種模式混合構(gòu)成。人工審批任務(wù)和取消采購單為并行模式中的兩個并行任務(wù);在人工審批任務(wù)之后是由兩個順序執(zhí)行的任務(wù)構(gòu)成的串行模式。
(1)定義數(shù)據(jù)類型
通過分析該業(yè)務(wù)流程所涉及的數(shù)據(jù),使用XML Schema定義數(shù)據(jù)類型,從而確定藥品采購服務(wù)的輸入和輸出。由于整個業(yè)務(wù)流程中流轉(zhuǎn)的是藥品采購單信息,藥品采購單包括藥品編碼、通用名、規(guī)格等藥品相關(guān)信息,以及需要購買的數(shù)量信息,所以該業(yè)務(wù)數(shù)據(jù)類型Purchase:RequestType是復(fù)合類型,由用戶定義類型Purchase:DrugInfo-Type和原始類型string和float組成。XML Schema部分代碼如下所示:
(2)設(shè)計服務(wù)接口調(diào)用服務(wù)
藥品采購服務(wù)是通過調(diào)用一些現(xiàn)有服務(wù)實現(xiàn),而在BPEL中對現(xiàn)有服務(wù)的調(diào)用是通過服務(wù)接口實現(xiàn)的。以調(diào)用人工審批服務(wù)為例,具體的實現(xiàn)方法是通過import引入所需資源,即現(xiàn)有服務(wù)的wsdl文件;使用partnerLinks伙伴鏈接來實現(xiàn)人工審批任務(wù)TaskManager.wsdl。以下代碼實現(xiàn)人工審批服務(wù)的調(diào)用:
(3)業(yè)務(wù)流程轉(zhuǎn)換為BPEL流程
一個BPEL流程即一個服務(wù)組合方案,因此要將業(yè)務(wù)流程抽象成用BPEL語言描述的BPEL文檔。在本案例中的基本活動有變量的賦值assign活動用于把從數(shù)據(jù)庫查出的藥品信息賦值到采購單信息中,當(dāng)采購單填寫完整時通過receive活動把該事件傳遞給人工審批服務(wù),通過invoke活動調(diào)用人工審批服務(wù)和采購單信息統(tǒng)計服務(wù)等;結(jié)構(gòu)化活動有完成人工審批任務(wù)和取消采購單這兩個并行任務(wù)的并行流結(jié)構(gòu)flow;執(zhí)行在人工審批任務(wù)之后的兩個任務(wù)的串行結(jié)構(gòu)sequence。當(dāng)確定這些結(jié)構(gòu)之后整個流程已經(jīng)基本完成,通過圖形化工具可以將該業(yè)務(wù)流程轉(zhuǎn)換為BPEL文檔。圖5、圖6為藥品采購業(yè)務(wù)的圖形化的BPEL流程。
(4)BPEL流程的完善
使用流程處理器可以提高服務(wù)質(zhì)量,增強BPEL流程的健壯性。在本業(yè)務(wù)流程中,采購單提交成功之后可能發(fā)生人工審批和采購單取消同時操作并生效的錯誤,此時需要添加錯誤處理器捕獲錯誤和補償處理器添加補償措施。具體實現(xiàn)機制是在調(diào)用采購單取消服務(wù)的作用域中添加錯誤處理器,人工審批服務(wù)的invoke活動后添加補償處理器。若取消采購單時該采購單還有審批通過的結(jié)果則拋出錯誤,錯誤處理器通過catch捕獲該錯誤,同時觸發(fā)人工審批服務(wù)的補償處理器,對人工審批服務(wù)進行回退,從數(shù)據(jù)庫中刪除該采購單相關(guān)數(shù)據(jù)信息。在采購單提交服務(wù)作用域中添加事件處理器,當(dāng)某采購單提交一周后,由于某種原因仍未有審批結(jié)果的時候通過事件處理器中on-Alarm觸發(fā),向人工審批服務(wù)再次發(fā)送審批請求。
圖5 藥品采購業(yè)務(wù)BPEL流程總圖
圖6 并行模式詳圖
(5)藥品采購服務(wù)的實現(xiàn)
將完善的BPEL文檔注入Oracle BPEL引擎后,引擎會根據(jù)業(yè)務(wù)流程的流轉(zhuǎn)通過伙伴鏈接調(diào)用相應(yīng)的服務(wù),從而實現(xiàn)藥品采購服務(wù)。由于發(fā)布后的藥品采購服務(wù)同時會生成相應(yīng)的wsdl文件,故可以直接調(diào)用藥品采購服務(wù)實現(xiàn)藥品采購業(yè)務(wù),亦可以繼續(xù)作為現(xiàn)有服務(wù)按照需要進行深層次整合,生成更復(fù)雜的服務(wù)。
基于BPEL的服務(wù)組合方法,將業(yè)務(wù)流程中各個服務(wù)按照一定的需要進行組合編排,并將自身暴露為一個新的Web服務(wù),滿足SOA架構(gòu)松耦合和異構(gòu)的要求,并且是高度敏捷的。另外,現(xiàn)實生活中的業(yè)務(wù)流程大都多變,BPEL只是把該組合中各個服務(wù)實現(xiàn)的順序變動一下,與傳統(tǒng)的硬編碼實現(xiàn)相比更加容易且方便。本文提出了基于BPEL的服務(wù)組合方法,并通過藥品采購業(yè)務(wù)實現(xiàn)了提交采購單服務(wù)、取消采購單服務(wù)和人工審批服務(wù)的服務(wù)組合。
[1]The OWL Services Coalition.OEL-S:semantic markup for Web Services[EB/OL].http://www.daml.org/services/owl-s/1.1/overview/,2006-11-08.
[2]T Andrews,F(xiàn) Curbera,H Dholakia,et al.Business proc ess execution language for Web services version 1.1[OL].http://www.ibm.com/developerworks/library/specifica-tion/wsbpel/,2002-07-30.
[3]鄧子云.SOA實踐者說:分布式環(huán)境下的系統(tǒng)集成[M].北京:電子工業(yè)出版社,2010.
[4]王紫瑤,南俊杰,段紫輝,等.SOA核心技術(shù)及應(yīng)用[M].北京:電子工業(yè)出版社,2008.
[5]梅彪,姜新文,吳恒.WS-BPEL業(yè)務(wù)流程與訪問控制[J].計算機工程,2008,34(19):144-146.