- 概況
- 內(nèi)核
- 擴(kuò)展
- 運(yùn)行時(shí)
- 內(nèi)部高層視圖
- Bootstrap
- 裝配模型
- 分發(fā)包
- 綁定擴(kuò)展
- 構(gòu)件實(shí)現(xiàn)擴(kuò)展
- 數(shù)據(jù)綁定擴(kuò)展
- 復(fù)合激活
- 加載SCA組件
- 與Spring集成
- Spring作為構(gòu)件實(shí)現(xiàn)
- Spring作為IOC容器
概況
SCA JAVA 運(yùn)行時(shí)是由內(nèi)核和擴(kuò)展兩部分組成。內(nèi)核本質(zhì)上是一個(gè)連接多個(gè)VM的引擎,使用依賴注入(Dependency Injection
)和控制反轉(zhuǎn)( Inversion of Control
)將構(gòu)件連接在一起。
內(nèi)核
其核心是設(shè)計(jì)簡單和功能有限的。它將不同的功能單元連接到一起,并且提供SPIs以讓擴(kuò)展之間可以互動(dòng),例如服務(wù)發(fā)現(xiàn),可靠性,支持透明協(xié)議,等等。這些功能都以擴(kuò)展的方式提供。
擴(kuò)展
擴(kuò)展提高了SCA運(yùn)行時(shí)的功能型。擴(kuò)展類型并不固定,Tuscany的核心通過提供一個(gè)可調(diào)整的模型的設(shè)計(jì)使其盡可能的靈活?,F(xiàn)在,已知的擴(kuò)展類型有:
- 組件實(shí)現(xiàn)類型:例如,spring、Groovy、Javascript
- 綁定類型:例如:Axis、CXF、AMQP、ActiveMQ、JXTA
- 數(shù)據(jù)綁定類型:例如,JAXB、SDO、XmlBeans
- 接口綁定類型:例如,WSDL、Java
具體細(xì)節(jié)可參考擴(kuò)展開發(fā)向?qū)?/a>
JAVA SCA 運(yùn)行時(shí)高層次概覽
下圖是Java SCA運(yùn)行時(shí)的一個(gè)高層次概覽,其中包括以下關(guān)鍵模塊:
- SCA規(guī)格API:SCA JAVA客戶端的API和執(zhí)行規(guī)格
- API:實(shí)現(xiàn)SCA規(guī)格API的Tuscany API
- 接口綁定:支持服務(wù)定義的類型,例如WSDL、Java……
- 數(shù)據(jù)綁定:實(shí)現(xiàn)數(shù)據(jù)支持,例如SDO、JAXB……
- 主機(jī)平臺(tái):提供Tuscany運(yùn)行時(shí)的環(huán)境

bootsrap
Bootstrap 進(jìn)程受主機(jī)環(huán)境控制。默認(rèn)進(jìn)程是由DefaultBootstrapper實(shí)現(xiàn)的。運(yùn)行時(shí)進(jìn)程服務(wù)使用SCA XML形式進(jìn)行集成,也可以采用其他形式:
- 加載階段處理SCDL,并在內(nèi)存中創(chuàng)建一個(gè)對應(yīng)的運(yùn)行時(shí)對象(例如:組件、服務(wù)、引用)
- 連接線將引用連接到服務(wù)

集成模型
SCA的裝配模型在Tuscany中是通過一系列接口實(shí)現(xiàn)的。以下是一些關(guān)鍵件:
- SCA組件是由SCA實(shí)現(xiàn)的實(shí)例配置而成,它提供和銷毀服務(wù)
- SCA服務(wù)用以聲明外部可訪問的服務(wù)實(shí)現(xiàn)
- SCA引用表示一個(gè)對其他服務(wù)實(shí)現(xiàn)的引用,這里被使用的服務(wù)通過配置指定
- 一種實(shí)現(xiàn)表示一種軟件技術(shù),例如Java類、BPEL流程、XSLT轉(zhuǎn)換、或者C++類,用以在SOA應(yīng)用中實(shí)現(xiàn)一個(gè)或多個(gè)服務(wù)。一個(gè)SCA集成也是一個(gè)實(shí)現(xiàn)。
- 組件類型指的是可配置的實(shí)現(xiàn)方式
- 接口定義了一個(gè)或多個(gè)業(yè)務(wù)功能,這些業(yè)務(wù)功能的實(shí)現(xiàn)由服務(wù)提供,通過引用為組件所使用,服務(wù)是由實(shí)現(xiàn)的接口所定義的,SCA目前支持兩種類型的接口:
- 一個(gè)SCA Composite十一個(gè)SCA域中的基本單元,它由組件、服務(wù)、引用、它們之間的連線組成。
- SCA聯(lián)結(jié)了服務(wù)引用和服務(wù)
- 服務(wù)和引用之間使用綁定聯(lián)結(jié)。引用使用綁定描述服務(wù)之間相互訪問的機(jī)制,服務(wù)使用綁定描述客戶端訪問服務(wù)的機(jī)制
- 屬性允許在外部實(shí)現(xiàn)的配置進(jìn)行設(shè)值,數(shù)據(jù)通過組件也可能源自于一個(gè)組合件的屬性提供。

發(fā)布
Tuscany運(yùn)行時(shí)提供了一個(gè)框架,以支持SCA發(fā)布。該框架可針對以下擴(kuò)展點(diǎn)進(jìn)行擴(kuò)展:
PackageProcessorExtensionPoint:負(fù)責(zé)處理不同的包或者檔案格式,例如:文件夾、JAR包、osgi包、EAR、WAR以及ZIP。
ArtifactProcessorExtensionPoint:負(fù)責(zé)處理具體類型的服務(wù),例如:WSDL、XSD、構(gòu)件、JAVA類、BPEL。

- 包處理器在安裝時(shí)掃描發(fā)布包,并且創(chuàng)建一個(gè)待處理列表,目前支持文件夾/文件系統(tǒng)和jar發(fā)布包,為了對發(fā)布包可用,包處理器程序需要通過包處理器擴(kuò)展點(diǎn)進(jìn)行自我注冊。
- 組件處理器被用來處理發(fā)布包中的組件,為了保持對發(fā)布服務(wù)可用,組件處理器需要使用組件處理擴(kuò)展進(jìn)行自我注冊,組件處理器會(huì)在以下兩個(gè)步驟進(jìn)行調(diào)用:
- 讀
取:
在這里你可以讀取一個(gè)組件(一個(gè)文檔、XML、類等等),實(shí)例化一個(gè)代表組件的模型并銷毀它。SCA發(fā)布服務(wù)對注冊了ArtifactProcessor
的組件調(diào)用ArtifactProcessor.read() 方法,如果你的模型對另外一個(gè)模型有引用,不要試圖也立即實(shí)例化另一個(gè)模型,你應(yīng)該只保留
引用信息,在處理階段這將變成一個(gè)指針,注意現(xiàn)在你沒必要完全讀取并實(shí)例化你的模型,可以延遲實(shí)例化。
- 處理:本階段給你機(jī)會(huì)使你可以處理對其他模型的引用(WSDL,類,其他復(fù)合組件,或者一個(gè)組件類型(componentType))。這時(shí),所有代表發(fā)布包里組件的模型被全部讀取出來,并且在發(fā)布的 ArtifactResolver進(jìn)行注冊,準(zhǔn)備處理。
- 所有可以部署的復(fù)合組件都應(yīng)該部署在SCA域
實(shí)現(xiàn)擴(kuò)展
實(shí)現(xiàn)擴(kuò)展負(fù)責(zé)支持實(shí)現(xiàn)方式的類型:比如Java、Script、BPEL等。
綁定擴(kuò)展
綁定擴(kuò)展負(fù)責(zé)支持綁定方式的類型:Web服務(wù)、JMS、JSON-RPC以及RMI。
接口擴(kuò)展
接口擴(kuò)展負(fù)責(zé)支持接口的類型,例如Java接口和WSDL1.1 portType。
數(shù)據(jù)綁定擴(kuò)展
請參考Tuscany Databinding Guide。
復(fù)合組件激活
在一個(gè)復(fù)合組件在配置好以后,它可以在SCA域進(jìn)行激活,Tuscany運(yùn)行時(shí)通過以下步驟去激活它:
1、構(gòu)建:在此階段,復(fù)合組件被進(jìn)一步常態(tài)化,以更容易和運(yùn)行時(shí)互動(dòng),元數(shù)據(jù)在服務(wù)/引用升級以后進(jìn)行合并?;诒馄降哪P?,我們可以在構(gòu)建級獲取全部的信息。
2、配置:在此階段,復(fù)合組件的層次被引導(dǎo)到配置一個(gè)組件的實(shí)現(xiàn),在組件間以及組件和外部服務(wù)之間,引用綁定和服務(wù)綁定會(huì)在以后的步驟中用來創(chuàng)建運(yùn)行時(shí)連接。
3、創(chuàng)建運(yùn)行時(shí)連接:
在此階段,通過選定的綁定方式,創(chuàng)建了組件引用和組件服務(wù)的運(yùn)行時(shí)連接。運(yùn)行時(shí)連接是調(diào)用鏈的集合。每個(gè)執(zhí)行鏈包含一組執(zhí)行器和攔截器。執(zhí)行器為綁定協(xié)議
和實(shí)現(xiàn)技術(shù)提供調(diào)用的邏輯,攔截器是一種特殊的執(zhí)行器,它為方法執(zhí)行提供了附加的邏輯,例如數(shù)據(jù)轉(zhuǎn)換以及交易控制。對于一個(gè)組件引用來說,我們創(chuàng)建運(yùn)行時(shí)
連接來表示通過綁定的對外執(zhí)行;對于組件服務(wù)呢,我們創(chuàng)建運(yùn)行時(shí)連接表示對實(shí)現(xiàn)類型的向內(nèi)連接。回調(diào)連接可以被附加到組件服務(wù)之上,表示來自服務(wù)的回調(diào)執(zhí)
行。
4、啟動(dòng)服務(wù)組件:在這個(gè)階段,ImplementationProvider,
ReferenceBindingProvider和ServiceBindingProvider 定義的start()
回調(diào)方法將被調(diào)用,最后,組件、組件引用以及組件服務(wù)被初始化去服務(wù)組件間的互動(dòng)。服務(wù)監(jiān)聽器被啟動(dòng)已接受從綁定層來的連接請求。


調(diào)用概況
1、調(diào)用被分派到WireInvocationHandler
2、WireInvocationHandler 尋找正確的InvocationChain
3、創(chuàng)建一條消息,設(shè)值payload,設(shè)值TargetInvoker,然后將消息通過鏈向下傳遞
4、當(dāng)消息到達(dá)鏈的底部后,TargetInvoker 會(huì)被調(diào)用,它按順序?qū)δ繕?biāo)進(jìn)行調(diào)度
5、當(dāng)將TargetInvoker 存儲(chǔ)后,當(dāng)連接源的可視范圍等于或小于目標(biāo)時(shí)(例如:request-》composite),外向端允許將目標(biāo)實(shí)例進(jìn)行緩存。
運(yùn)行時(shí)提供具有InboundWires 和OutboundWires的構(gòu)件。InvocationChains 被構(gòu)件連接所持有,因此它是無狀態(tài)的,允許引入新的攔截器以及重新連接等動(dòng)態(tài)事件的發(fā)生。
加載SCA部件
組件處理器
組件處理器被用來處理發(fā)布包中的組件,為了保持對發(fā)布服務(wù)可用,組件處理器需要使用組件處理擴(kuò)展進(jìn)行自我注冊,組件處理器會(huì)在以下兩個(gè)步驟進(jìn)行調(diào)用:
- 讀?。?nbsp;
在這里你可以讀取一個(gè)組件(一個(gè)文檔、XML、類等等),實(shí)例化一個(gè)代表組件的模型并銷毀它。SCA發(fā)布服務(wù)對注冊了ArtifactProcessor
的組件調(diào)用ArtifactProcessor.read() 方法,如果你的模型對另外一個(gè)模型有引用,不要試圖也立即實(shí)例化另一個(gè)模型,你應(yīng)該只保留
引用信息,在處理階段這將變成一個(gè)指針,注意現(xiàn)在你沒必要完全讀取并實(shí)例化你的模型,可以延遲實(shí)例化。
- 處理:本階段給你機(jī)會(huì)使你可以處理對其他模型的引用(WSDL,類,其他復(fù)合組件,或者一個(gè)組件類型(componentType))。這時(shí),所有代表發(fā)布包里組件的模型被全部讀取出來,并且在發(fā)布的 ArtifactResolver進(jìn)行注冊,準(zhǔn)備處理。
加載JAVA SCA
SCA服務(wù)部件在SCA里以SCDL文件的形式進(jìn)行部署,Tuscany運(yùn)行時(shí)組件處理器加載這些SCDL到模型對象,這些對象包含了元數(shù)據(jù)。
有兩種主要的加載器:
1、StAXElementLoader:從StAX 事件加載XML
2、ComponentTypeLoader:為一個(gè)實(shí)現(xiàn)加載組件類別或者處理一個(gè)文件
加載組件類別
為實(shí)現(xiàn)規(guī)范加載組件類型定義
1、如何實(shí)現(xiàn)是實(shí)現(xiàn)規(guī)范
運(yùn)行時(shí)組件的類圖