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