概述
SCA Java運(yùn)行時(shí)由core和extension組成。Core本質(zhì)上來說是一個(gè)多VM的wiring引擎。該引擎使用IOC(控制反轉(zhuǎn))和DI(依賴注入)原則來連接組件。
Core
Core在性能方面是簡(jiǎn)單而有限的。它將功能單元連接在一起,并提供可以和extension交互的SPI機(jī)制。例如象服務(wù)發(fā)現(xiàn),可靠性,對(duì)傳輸協(xié)議的支持等特性都是通過extension來做的。
Extension
Extension增強(qiáng)SCA運(yùn)行時(shí)的功能。Extesion類型不是固定的。而core則是通過提供對(duì)extension模塊開放支持來使得設(shè)計(jì)盡量靈活。
- 組件實(shí)現(xiàn)類型,例如:Spring, Groovy 和Javascript
- 綁定類型,比如:Axis, CXF ,AMQP ,ActiveMQ, JXTA
- 數(shù)據(jù)綁定類型,比如:JAXB, SDO ,XmlBean
- 接口綁定類型,比如:WSDL, Java
關(guān)于如何實(shí)現(xiàn)一個(gè)extension的詳細(xì)信息可以在Extensions Guide中查看。
運(yùn)行時(shí)
Core是設(shè)計(jì)得可以嵌入于許多不同的主機(jī)環(huán)境下的。例如,core也許用于OSGI容器、單獨(dú)的運(yùn)行時(shí)環(huán)境、serlvet引擎或J2EE應(yīng)用服務(wù)器中。運(yùn)行時(shí)的性能根據(jù)主機(jī)環(huán)境不同而不同。
Java SCA運(yùn)行時(shí)的高層概述:
下圖是由關(guān)鍵的模塊/包組成的SCA運(yùn)行時(shí)高層視圖
1、 SCA Spec API:由SCA Java Client and Implementation定義的API
2、 API:擴(kuò)展了SCA Spec API的Tuscany API
3、 Core:運(yùn)行時(shí)實(shí)現(xiàn)和SPI擴(kuò)展機(jī)制
4、 Extension:
1. Component(英文原版有錯(cuò)誤) implementation – 擴(kuò)展語言支持:例如 BPEL,Python,C++,Ruby等
2. Binding – 擴(kuò)展協(xié)議支持:例如 Axis2, CXF等
3. Interface Binding – 擴(kuò)展服務(wù)定義類型:比如SWDL, Java等
4. Databinding – 擴(kuò)展數(shù)據(jù)支持:比如SDO, JAXB等
5、 Host platforms:Tuscany運(yùn)行時(shí)的主機(jī)環(huán)境

<!--[if !vml]--><!--[endif]-->
內(nèi)部高層視圖
參考下圖:

<!--[if !vml]--><!--[endif]-->
引導(dǎo)過程
引導(dǎo)過程是由主機(jī)環(huán)境控制的。默認(rèn)的實(shí)現(xiàn)是DefaultBootstrapper。運(yùn)行時(shí)由某個(gè)成型的SCA Assembly XML文件序列化而來并處理服務(wù)裝配。
- 裝載階段處理SCDL并創(chuàng)建一個(gè)內(nèi)存模型處理相應(yīng)的運(yùn)行時(shí)工件(例如組件componet,服務(wù)service,引用reference)
- 連接階段將對(duì)服務(wù)的引用連接起來
裝配模型
SCA裝配模型在Tuscany中是用一系列接口表示的。如下是些關(guān)鍵的元素。
- SCA component 是配置化的SCA實(shí)現(xiàn)的實(shí)例,它可以提供服務(wù)或消費(fèi)服務(wù)。
- SCA service用于聲明實(shí)現(xiàn)的可以被外部訪問的服務(wù)
- SCA reference用于表示該實(shí)現(xiàn)對(duì)某些其他實(shí)現(xiàn)所提供的服務(wù)的依賴。該依賴的服務(wù)可以通過配置來指定。
Implementation是用于描述軟件技術(shù)的概念,例如在面向服務(wù)的應(yīng)用中實(shí)現(xiàn)了一個(gè)或多個(gè)服務(wù)的Java 類,BEPL,XSLT轉(zhuǎn)換,C++類。SCA composite也是implementaion。
ComponentType涉及實(shí)現(xiàn)的可配置的方面。
Interface定義了一個(gè)或多個(gè)業(yè)務(wù)功能。這些業(yè)務(wù)功能通過Service提供,通過Reference讓其他組件使用。服務(wù)是由實(shí)現(xiàn)的接口來定義的。現(xiàn)在SCA支持兩種接口類型系統(tǒng):Java接口、SWDL portType
SCA composite是SCA域中的compositon的基礎(chǔ)單元。SCA Composite是組件的裝配,服務(wù)、應(yīng)用和wire都互相連接。
SCA wire將服務(wù)引用連接到服務(wù)上。
Binding是被服務(wù)和引用所使用的。引用使用綁定來描述訪問機(jī)制,該機(jī)制用于訪問連接的服務(wù)。服務(wù)使用綁定來描述客戶程序調(diào)用服務(wù)的訪問機(jī)制。
Property是考慮到有的實(shí)現(xiàn)配置需要顯式地設(shè)置數(shù)據(jù)值。該數(shù)據(jù)值由組件提供,當(dāng)然也可能來源于容器composite的屬性。

<!--[if !vml]--><!--[endif]-->
Contribution
Tuscany運(yùn)行時(shí)提供了一個(gè)框架來支持SCA的contribution。框架可以通過下列的兩個(gè)擴(kuò)展點(diǎn)來擴(kuò)展:
PackageProcessorExtensionPoint:它用于處理不同的包裝格式或歸檔的擴(kuò)展,可以是目錄、Jar、OSGI bundle、EAR、War或Zip。
ArtifactProcessorExtensionPoint:它用于處理特定工件類型的擴(kuò)展,可以是SWDL,XSD,composite,java類后BEPL。

<!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->l
<!--[endif]-->包處理器會(huì)掃描安裝了的contribution,并產(chǎn)生需要處理的工件列表。當(dāng)前有支持文件夾/文件系統(tǒng)和
Jar contribution包。為了讓contribution服務(wù)有效,包處理器要注冊(cè)自己給包處理extension 。
<!--[if !supportLists]-->l
<!--[endif]-->工件處理器用于處理contribution上的每個(gè)有效的工件。為了讓contribution服務(wù)有效,工
件處理器要注冊(cè)自己給工件處理extension 。對(duì)于每個(gè)工件,工件處理器分兩個(gè)階段被調(diào)用。
<!--[if
!supportLists]-->?
<!--[endif]-->讀階段:這里是你讀取工件(可以是一個(gè)文檔、XML元素或類等等)的地方,組裝描述工件的模型并返回它。SCA
contribution服務(wù)在所有注冊(cè)了工件處理器的工件上調(diào)用ArtifactProcessor.read()。假如你的模型引用了其他的模型,
不需要立刻裝載那些模型,你只需要保持描述引用的信息,在resolve階段,你將會(huì)把該信息轉(zhuǎn)換成指向被引用模型的指針。注意:你沒有必要在這個(gè)時(shí)刻完
全讀取并裝載模型,你可以在以后來完成這些工作。
<!--[if !supportLists]-->?
<!--[endif]-->解析階段:這個(gè)階段讓你有機(jī)會(huì)解析對(duì)其他模型的引用。這個(gè)時(shí)刻,SCA
contribution中所有的描述工件的模型都已經(jīng)讀取,并注冊(cè)了工件解析器,準(zhǔn)備被解析。
<!--[if !supportLists]-->l <!--[endif]-->所有可部署的composite應(yīng)該在現(xiàn)在準(zhǔn)備部署到SCA域中。
包處理器會(huì)掃描安裝了的contribution,并產(chǎn)生需要處理的工件列表。當(dāng)前有支持文件夾/文件系統(tǒng)和Jar contribution包。為了讓contribution服務(wù)有效,包處理器要注冊(cè)自己給包處理extension 。
工件處理器用于處理contribution上的每個(gè)有效的工件。為了讓contribution服務(wù)有效,工件處理器要注冊(cè)自己給工件處理extension 。對(duì)于每個(gè)工件,工件處理器分兩個(gè)階段被調(diào)用。
?
讀階段:這里是你讀取工件(可以是一個(gè)文檔、XML元素或類等等)的地方,組裝描述工件的模型并返回它。SCA contribution服務(wù)在所有注冊(cè)
了工件處理器的工件上調(diào)用ArtifactProcessor.read()。假如你的模型引用了其他的模型,不需要立刻裝載那些模型,你只需要保持描述
引用的信息,在resolve階段,你將會(huì)把該信息轉(zhuǎn)換成指向被引用模型的指針。注意:你沒有必要在這個(gè)時(shí)刻完全讀取并裝載模型,你可以在以后來完成這些
工作。
? 解析階段:這個(gè)階段讓你有機(jī)會(huì)解析對(duì)其他模型的引用。這個(gè)時(shí)刻,SCA contribution中所有的描述工件的模型都已經(jīng)讀取,并注冊(cè)了工件解析器,準(zhǔn)備被解析。
所有可部署的composite應(yīng)該在現(xiàn)在準(zhǔn)備部署到SCA域中。
實(shí)現(xiàn)擴(kuò)展
實(shí)現(xiàn)擴(kuò)展負(fù)責(zé)實(shí)現(xiàn)類型的支持,例如Java,Script和BEPL
綁定擴(kuò)展
綁定擴(kuò)展負(fù)責(zé)對(duì)綁定類型進(jìn)行支持,例如web service,JMS,JSON-RPC和RMI
接口擴(kuò)展
接口擴(kuò)展負(fù)責(zé)接口類型的擴(kuò)展,例如Java接口和WSDL 1.1 portType
數(shù)據(jù)綁定擴(kuò)展
請(qǐng)看我翻譯的Tuscany數(shù)據(jù)綁定指南
Composite 激化
在composite完整地配置后,就能在SCA域中激活它。Tuscany運(yùn)行時(shí)用以下步驟激化composite:
1、 構(gòu)建composite:這個(gè)階段,composite模型更進(jìn)一步地正規(guī)化來方便運(yùn)行時(shí)的交互。元數(shù)據(jù)在service/reference提升后統(tǒng)一化了。根據(jù)這個(gè)扁平模型,我們可以獲取所有的組件級(jí)信息。
2、 配置composite:這個(gè)階段,composite層次結(jié)構(gòu)用于導(dǎo)航組件實(shí)現(xiàn)的配置信息。引用綁定和服務(wù)通過提供者工廠來創(chuàng)建運(yùn)行時(shí)組件以及外部服務(wù)之間的連接。
3、
創(chuàng)建運(yùn)行時(shí)連接(wire):這個(gè)階段,為組件引用和組件服務(wù)以選定的綁定形式創(chuàng)建運(yùn)行時(shí)連接。運(yùn)行時(shí)連接是一個(gè)調(diào)用鏈的集合。這些調(diào)用鏈按照操作來分成
區(qū)。每個(gè)調(diào)用鏈都由一系列的調(diào)用器和攔截器構(gòu)成。調(diào)用器提供到綁定協(xié)議和實(shí)現(xiàn)技術(shù)的邏輯調(diào)用。攔截器是特定類型的調(diào)用器,為調(diào)用它提供了附加的功能,比如
數(shù)據(jù)傳輸和事務(wù)控制。對(duì)于一個(gè)組件引用,我們創(chuàng)建運(yùn)行時(shí)連接(wire)來描述以選定綁定的形式對(duì)外的調(diào)用。對(duì)于組件服務(wù),我們創(chuàng)建運(yùn)行時(shí)連接
(wire)來描述對(duì)實(shí)現(xiàn)的對(duì)內(nèi)調(diào)用。回調(diào)連接(callback wire)能附加到組件服務(wù)上來描述來自服務(wù)的一個(gè)回調(diào)調(diào)用。
4、
啟動(dòng)composite:這個(gè)階段,由ImplementationProvider、ReferenceBindingProvider和
ServiceBindingProvider定義的start()回調(diào)方法會(huì)被調(diào)用。最終,組件,組件引用和組件服務(wù)被初始化而服務(wù)于組件的交互。服務(wù)
監(jiān)聽器會(huì)啟動(dòng),從而接受來自綁定層(binding layer)的入內(nèi)請(qǐng)求。


<!--[if !vml]--><!--[endif]-->
<!--[if !vml]--><!--[endif]-->
調(diào)用概述
調(diào)用會(huì)被分發(fā)到WireInvocationHandler
WireInvocationHandler查找正確的InvocationChain
然后創(chuàng)建一個(gè)消息,設(shè)置有效負(fù)載,設(shè)置TargetInvoker,并傳遞消息給下層鏈
當(dāng)消息到達(dá)鏈的末端,TargetInvoker會(huì)被調(diào)用,現(xiàn)在輪到TargetInvoker負(fù)責(zé)叫調(diào)用分發(fā)到目標(biāo)
存儲(chǔ)在outbound邊界上的TargetInvoker當(dāng)連接源的作用域值等于或小于目標(biāo)的作用域值時(shí),允許緩存目標(biāo)實(shí)例。運(yùn)行時(shí)環(huán)境通過
Inboundwire和Outboundwire提供組件。調(diào)用鏈附著于組件連接(wire)中,因此是無狀態(tài)的。所以調(diào)用鏈可以具有動(dòng)態(tài)行為,例如新
攔截器的介入和重新連接。
裝載SCA裝配
工件處理器用于處理contribution上的每個(gè)有效的工件。為了讓contribution服務(wù)有效,工件處理器要注冊(cè)自己給工件處理extension 。對(duì)于每個(gè)工件,工件處理器分兩個(gè)階段被調(diào)用。
?
讀階段:這里是你讀取工件(可以是一個(gè)文檔、XML元素或類等等)的地方,組裝描述工件的模型并返回它。SCA contribution服務(wù)在所有注冊(cè)
了工件處理器的工件上調(diào)用ArtifactProcessor.read()。假如你的模型引用了其他的模型,不需要立刻裝載那些模型,你只需要保持描述
引用的信息,在resolve階段,你將會(huì)把該信息轉(zhuǎn)換成指向被引用模型的指針。注意:你沒有必要在這個(gè)時(shí)刻完全讀取并裝載模型,你可以在以后來完成這些
工作。
? 解析階段:這個(gè)階段讓你有機(jī)會(huì)解析對(duì)其他模型的引用。這個(gè)時(shí)刻,SCA contribution中所有的描述工件的模型都已經(jīng)讀取,并注冊(cè)了工件解析器,準(zhǔn)備被解析。
裝載Java SCA
SCA服務(wù)裝配以SCDL文件的形式被發(fā)布到SCA域中。Tuscany運(yùn)行時(shí)工件處理器將SCDL裝載成一系列模型對(duì)象。這些模型對(duì)象是一系列持有元數(shù)據(jù)信息的Java bean。
有兩種裝載器:
- StAXElementLoader:從StAX(Streaming API for XML)事件載入XML元素
- ComponentTypeLoader:通過解析文件或內(nèi)省機(jī)制來載入實(shí)現(xiàn)的組件類型
裝載組件類型
為特定的實(shí)現(xiàn)載入組件類型定義:
- 如何做是實(shí)現(xiàn)規(guī)范
- 也許會(huì)裝載XML文件(該文件由具體實(shí)現(xiàn)來定位)
- 也許內(nèi)省實(shí)現(xiàn)工件(例如 Java注解機(jī)制)
- 或其他的任何方式
Loading composite componentType Loader
- 從提供的URL中載入SCDL
- 從composite包解壓并載入SCDL
- POJO componetType Loader
- 內(nèi)省Java 注解
- 利用可插入的注解處理框架來內(nèi)省Java類
運(yùn)行時(shí)工件的類圖
