黃川林, 程 勖, 陳偉衛(wèi) (大連東軟信息學(xué)院,遼寧 大連 116023)
隨著經(jīng)濟全球化的迅速發(fā)展,現(xiàn)代物流信息系統(tǒng)的作用日益突出,它已經(jīng)被越來越多的企業(yè)作為自己趕超世界潮流的標志之一。然而現(xiàn)有的物流信息系統(tǒng)基本都采用面向?qū)ο笤O(shè)計,造成系統(tǒng)在體系結(jié)構(gòu)、數(shù)據(jù)標準和接口等各方面的不一致。因此,現(xiàn)代物流技術(shù)中急需解決的問題是如何有效地整合異構(gòu)的物流信息系統(tǒng),從而實現(xiàn)物流相關(guān)信息系統(tǒng)的信息互通,提高物流運作效率和降低物流成本。
WS-BPEL(Web Services Business Process Execution Language)是一種業(yè)務(wù)流程的建模語言,基于一系列的開放技術(shù)標準[1]。利用WS-BPEL作為描述企業(yè)的物流信息系統(tǒng)Web服務(wù)組合的語言,可以管理和優(yōu)化物流中的各企業(yè)各部門之間的異構(gòu)資源,實現(xiàn)基于面向服務(wù)的體系架構(gòu)的物流信息系統(tǒng)的集成。
目前物流信息系統(tǒng)主要存在以下問題:
(1)由于實現(xiàn)技術(shù)和系統(tǒng)結(jié)構(gòu)的不同,導(dǎo)致系統(tǒng)間交互復(fù)雜;
(2)數(shù)據(jù)流向混亂、流程繁多;
(3)結(jié)構(gòu)復(fù)雜,使得業(yè)務(wù)需求不易改變。
針對目前物流信息系統(tǒng)存在的問題,在對現(xiàn)有系統(tǒng)的有效集成基礎(chǔ)上,利用Web Services封裝原有需要開放出來的功能,從而使各系統(tǒng)都具有統(tǒng)一的接口標準,并通過引入SOA架構(gòu),不但能夠?qū)崿F(xiàn)各系統(tǒng)間的信息交互,還能使之成為既相互獨立,又協(xié)調(diào)統(tǒng)一的整體,構(gòu)建出如圖1所示的物流信息系統(tǒng)架構(gòu)。在此架構(gòu)中還搭建了一個公共信息交換平臺,該平臺是為實現(xiàn)系統(tǒng)集成和各個系統(tǒng)之問的數(shù)據(jù)共享,提供有效地決策支持數(shù)據(jù),需要建立基于數(shù)據(jù)管理和利用的綜合性技術(shù)方案的共享數(shù)據(jù)中心,用以存放大量數(shù)據(jù)的同時有效地將數(shù)據(jù)管理起來,提供數(shù)據(jù)訪問的手段,為集成系統(tǒng)和各個子系統(tǒng)之間的數(shù)據(jù)共享提供平臺,保證數(shù)據(jù)的及時性、完整性和一致性[2]。
Web服務(wù)體系結(jié)構(gòu)描述了服務(wù)請求者、服務(wù)提供者和UDDI服務(wù)注冊中心三個角色以及查找、發(fā)布和綁定與發(fā)現(xiàn)這三種操作[3]。服務(wù)提供者通過客戶端發(fā)布代理在服務(wù)注冊中心 (通常采用UDDI)注冊配置和發(fā)布服務(wù);服務(wù)請求者需要使用某個Web服務(wù)時,根據(jù)服務(wù)信息使用客戶端查找代理在服務(wù)注冊中心查找所需的服務(wù),注冊中心返回服務(wù)的接口描述文檔 (WSDL);服務(wù)請求者根據(jù)獲取的服務(wù)接口描述文檔通過SOAP協(xié)議綁定服務(wù)提供者并調(diào)用提供者所提供的服務(wù)。
圖1 基于SOA的物流信息系統(tǒng)架構(gòu)
系統(tǒng)把服務(wù)代理的角色引入SOA模型,從而實現(xiàn)對SOA模型的擴展。該模型除了服務(wù)提供者、服務(wù)請求者和UDDI服務(wù)注冊中心三個基本角色外,還包括一個特殊的角色——服務(wù)代理。服務(wù)代理處于服務(wù)提供者和服務(wù)請求者之間,起到中介作用,所有已知并且可用的Web Services都將映射到服務(wù)代理上[4]。服務(wù)代理將根據(jù)自己功能的需要對Web Services的屬性進行擴展,從而達到提高Web Services檢索效率的目的。
以擴展的SOA模型為依據(jù),建立基于服務(wù)代理的BPEL流程框架,如圖2所示。對于BPEL流程的一般節(jié)點來說,在流程定義時已經(jīng)為其指定了用于實現(xiàn)的Web Services,當路由到該節(jié)點時就可以直接調(diào)用該Web Services;而對于BPEL流程中需要動態(tài)調(diào)用Web Services的節(jié)點來說,它們要先發(fā)送調(diào)用Web Services的請求到服務(wù)代理,由服務(wù)代理根據(jù)請求為該節(jié)點在多個Web Services中擇優(yōu)選擇并分配一個Web Services,從而實現(xiàn)BPEL流程動態(tài)地調(diào)用 Web Services。
基于服務(wù)代理的BPEL流程框架最大的優(yōu)點在于:結(jié)構(gòu)簡單,易于實現(xiàn)。首先,該框架可以視為是對SOA的擴展,由于服務(wù)代理本身就是一個Web服務(wù),這樣BPEL流程與服務(wù)代理之間的關(guān)聯(lián)通過簡單的BPEL編碼就可以實現(xiàn)。
Web服務(wù)代理的實現(xiàn)主要是對服務(wù)的動態(tài)調(diào)用和流程的調(diào)用接口的實現(xiàn)。下面主要對這兩方面進行描述。
(1)Web服務(wù)動態(tài)調(diào)用的實現(xiàn)
實現(xiàn)BPEL流程對Web服務(wù)動態(tài)調(diào)用分兩個階段:首先,服務(wù)選擇器根據(jù)Web服務(wù)的功能擇優(yōu)選擇一個Web服務(wù);最后,通過一定方法調(diào)用該Web服務(wù),并將執(zhí)行結(jié)果反饋給BPEL流程。
Web服務(wù)的優(yōu)化選擇算法的策略不是唯一的,這些策略可以有:成本最低、響應(yīng)時間最快、可靠性最好等單一規(guī)則,另外根據(jù)QoS計算模型所得到的綜合測評結(jié)果也可以作為Web服務(wù)選擇的策略。將Web服務(wù)的類型和選擇策略作為函數(shù)的輸入,優(yōu)化選擇算法的偽代碼描述如下。
public String service Optimization(String class,String rule)
{
switch rule
case Duration
//選擇響應(yīng)時間短的Web服務(wù)
case Price
//選擇服務(wù)價格最低的Web服務(wù)
case QoS
//選擇服務(wù)質(zhì)量綜合測評最好的
return服務(wù)地址
圖2 基于服務(wù)代理的BPEL流程框架
}
實現(xiàn)對Web服務(wù)的調(diào)用根據(jù)上一階段獲取的Web服務(wù)URL,可以獲取該Web服務(wù)的描述WSDL,WSDL中包含一些對Web服務(wù)參數(shù)的描述,利用.Net的反射Reflection技術(shù),將遠程Web服務(wù)在本地進行實例化。按照Reflection的描述,首先定義代理類,根據(jù)WSDL中的內(nèi)容設(shè)置代理類的編譯參數(shù),編譯代理類,生成代理實例,并使用被Web服務(wù)的方法,最后返回結(jié)果,該過程如圖3所示。
圖3 Web服務(wù)本地實例化的過程
下面是將實現(xiàn)Web服務(wù)遠程調(diào)用算法的描述。
public static object invokeWebService(url,arg[])
{
//獲取 WSDL
webClient wc=new webClient();
stream str=wc.OpenRead(url+“?WSDL”);
//從str中截取服務(wù)描述信息ServiceDescription
//生成代理類代碼
CodeCompileUnit ccu=new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn,ccu);
CSharpCodeProvider icc=new CSharpCodeProvider();
//設(shè)定編譯參數(shù)
CompilerParameters cplist=new CompilerParameters();
//為 cplist對象添加 GenerateExecutable、GenerateInMemory
Cplist.ReferencedAssemblies.Add(“System.dll”);
Cplist.ReferencedAssemblies.Add(“System.XML.dll”);
Cplist.ReferencedAssemblies.Add(“System.Web.Services.dll”);
Cplist.ReferencedAssemblies.Add(“System.Data.dll”);
//編譯代理類
CompilerResults cr=icc.CompileAssemblyFromDom(cplist,ccu);
//生成代理實例,并調(diào)用方法
System.Reflection.Assembly assembly=cr.CompiledAssembly;
Type t=assembly.GetType(@namespace+"."+classname,true,true
object obj=Activator.CreateInstance(t);
System.Reflection.MethodInfo mi=t.GetMethod(methodname);
//返回結(jié)果
return mi.Invoke(obj,args);
}
(2)BPEL流程的調(diào)用接口實現(xiàn)
BPEL流程本身也是以Web服務(wù)的形式向外提供調(diào)用接口的,下面是對BPEL流程接口的WSDL定義。
<wsdl:definitions name=“process”...>
<!--端口類型定義-->
<portType name=“process”>
<operation name=“callAgent”>
<input message=“inputMessage”/>
<output message=“outputMessage”/>
</operation>
</portType>
<!--合作伙伴鏈接類型定義-->
<plnk:partnerLinkType name=“agent”>
<plnk:role name=“agentService”>
<plnk:portType name=“tns:agent”
</plnk:role>
</plnk:partnerLinkType>
</wsdl:definitions>
該WSDL定義聲明了callAgent操作,其輸入和輸出消息的定義類似于服務(wù)代理中操作消息的定義,此不贅述。為了描述BPEL流程和服務(wù)代理的交互關(guān)系,需要預(yù)先在BPEL流程接口的描述中定義合作關(guān)系的類型,由于BPEL流程和服務(wù)代理之間的屬于同步調(diào)用關(guān)系,只需定義服務(wù)代理的端口和角色。
本文通過采用SOA重構(gòu)技術(shù),利用以Web Services為基礎(chǔ)的WS-BPEL技術(shù)解決了目前物流相關(guān)企業(yè)的信息系統(tǒng)架構(gòu)各異,實現(xiàn)的技術(shù)眾多,無法采用傳統(tǒng)的架構(gòu)模式對現(xiàn)有的系統(tǒng)進行有效集成,從而導(dǎo)致物流資源信息缺乏有效共享等問題,最終實現(xiàn)了基于面向服務(wù)的體系架構(gòu)的物流信息系統(tǒng)的集成。
[1] 李文娟.基于WS-BPEL的Web服務(wù)組合執(zhí)行引擎的設(shè)計與實現(xiàn)[D].西安:西北大學(xué) (碩士學(xué)位論文),2009.
[2] 王念念,傅秀芬,呂占德.基于SOA的物流信息系統(tǒng)的研究與設(shè)計[J].計算機技術(shù)與發(fā)展,2011,21(12):213-216.
[3] 劉樹軍.基于WebService的應(yīng)用集成關(guān)鍵技術(shù)研究[D].銀川:寧夏大學(xué) (碩士學(xué)位論文),2011.
[4] 趙廣建,申利民,劉波,等.BPEL流程動態(tài)調(diào)用Web服務(wù)的實現(xiàn)方法[J].計算機工程與設(shè)計,2010,31(11):2952-2954.