Tuscany作為SCA Spec1.0實(shí)現(xiàn),現(xiàn)在已接近Release 1.0的尾聲,在近期將發(fā)布。其結(jié)構(gòu)相對(duì)7月份發(fā)布的0.91版本進(jìn)行了較大的調(diào)整,優(yōu)化了代碼的結(jié)構(gòu)并且增加了部分新功能。本文將針對(duì)其最新代碼,通過(guò)對(duì)其啟動(dòng)過(guò)程進(jìn)行分析,來(lái)了解Tuscany中對(duì)資源的加載及模型組裝的處理。
一、啟動(dòng)前準(zhǔn)備
1、 擴(kuò)展點(diǎn)注冊(cè)器實(shí)例化
Tuscany的實(shí)現(xiàn)采用了擴(kuò)展點(diǎn)機(jī)制,所有的可重用對(duì)象都會(huì)在其中注冊(cè),因此把擴(kuò)展點(diǎn)注冊(cè)器作為參數(shù)來(lái)回傳遞,通過(guò)它可以從中拿到所有的已注冊(cè)對(duì)象。
2、 注冊(cè)對(duì)象到擴(kuò)展點(diǎn)注冊(cè)器
Tuscany的現(xiàn)有版本與以前版本進(jìn)行了較大改進(jìn),由原來(lái)在代碼中指定改為了由配置文件中指定,加載的方式也改為了Lazy Loading,在從注冊(cè)器中取得對(duì)象時(shí)加載配置文件,然后把實(shí)例放入注冊(cè)器的集合中,以便下次直接從中取得需要的對(duì)象,不再解析配置文件。
最先注冊(cè)的對(duì)象有:WorkScheduler,ModelFactoryExtensionPoint,ContextFactoryExtensionPoint,ProxyFactory,InterfaceContractMapper。
3、 加載ModuleActivator
遍歷所有定義的ModuleActivator文件,解析其中的內(nèi)容作為ModuleActivator接口的實(shí)現(xiàn),然后執(zhí)行其中的start方法。
ModuleActivator現(xiàn)有接口已經(jīng)去掉了擴(kuò)展點(diǎn)注冊(cè)的方法。
4、 解析策略配置文件definitions.xml
策略配置文件配置了針對(duì)binding,implementation所使用的策略,其使用方式可參考其SCA spec中的 Policy Framework一節(jié)。
二、資源加載
Tuscany對(duì)資源的劃分是以Contribution為單位的,Contribution作為一組資源的集合,包含了SCA的配置文件如*.composite,*.componentType,sca-contribution.xml,以及用到的一些附加文件如*.wsdl等。
現(xiàn)在說(shuō)明一下Tuscany對(duì)單個(gè)Contribution的資源加載處理。
1、 資源查找
在Tuscany中定義了兩種Processor,Dir Processor和Jar Processor,分別對(duì)目錄及Jar中資源進(jìn)行遍歷,返回其中包含的資源列表。
2、 資源解析
針對(duì)Contribution中的每一個(gè)資源都會(huì)生成DeployedArtifact對(duì)象,在其屬性Model中保存著資源的元模型數(shù)據(jù)。
每個(gè)資源解析成元模型主要是依據(jù)針對(duì)每一資源有一對(duì)應(yīng)的Processor,在其中包含有Read方法負(fù)責(zé)解析提供URL對(duì)應(yīng)的資源。已提供的解析器有針對(duì)*.composite,*.componentType,*.wsdl,*.xsd類型文件的解析。同時(shí)針對(duì)文件中的不同結(jié)點(diǎn)也定義了相應(yīng)的解析器,如對(duì)composite,reference,property,service等結(jié)點(diǎn)的解析。Tuscany中采用流XStream方式解析。
3、 可發(fā)布資源解析
每一個(gè)Contribution中都可以定義對(duì)外發(fā)布的資源列表,通過(guò)META-INF/sca-contribution.xml進(jìn)行定義。同時(shí),在其中也可以定義對(duì)外引用和對(duì)外暴露的服務(wù)。其Schema格式如下:
示例:
Contribution的結(jié)構(gòu)圖如下:
三、資源組裝
針對(duì)每個(gè)Contribution中的可發(fā)布資源,如果類型為composite,則進(jìn)行各個(gè)composite,component之間的關(guān)聯(lián)(Wire)。
組裝的過(guò)程分為三個(gè)步驟:build, activate, start。
1、 build過(guò)程
build主要完成Composite之間的關(guān)聯(lián),包括compoiste文件中Include元素的解析,Component實(shí)現(xiàn)為Compoiste的處理,以及Service,binding,Reference的處理等等。
2、 activate過(guò)程
主要完成component的ImplementationProvider的賦值,同時(shí)針對(duì)component中Service的binding進(jìn)行設(shè)置BindingProvider,并針對(duì)每一Service,設(shè)置其RuntimeWire。
3、 start過(guò)程
主要完成Component對(duì)應(yīng)的ServiceBindingProvider,ImplementationProvider,ScopeContainer完成啟動(dòng),通過(guò)執(zhí)行方法start完成。
形成RuntimeWire過(guò)程圖如下:
