調(diào)出單機(jī)的Tuscany運(yùn)行時(shí)
當(dāng)開始考慮Tuscany SCA java運(yùn)行時(shí)環(huán)境的時(shí)候,理解高層調(diào)用是什么和為什么是非常有用的。當(dāng)前關(guān)于”Domain”對象有些實(shí)現(xiàn),該對象用于啟動(dòng)Tuscany。
DefaultSCADomain –一個(gè)簡單的域?qū)崿F(xiàn),該實(shí)現(xiàn)隱藏了大部分的細(xì)節(jié)。現(xiàn)在為止用于大多數(shù)的測試用例。
EmbeddedSCADomain – 用于將Tuscany嵌入到其他的系統(tǒng)中
HotUpdateSCADomain - 當(dāng)他們改變的時(shí)候會自動(dòng)裝載的例子
EmbeddedNode - 分布式域中的一個(gè)節(jié)點(diǎn)
一般認(rèn)為EmbeddedSCADomain在調(diào)出運(yùn)行時(shí)給出了一個(gè)必要的好的入口點(diǎn)。這個(gè)類在svn(http://svn.apache.org/repos/asf/incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/EmbeddedSCADomain.java)并且測試程序可在(http://svn.apache.org/repos/asf/incubator/tuscany/java/sca/modules/host-embedded/src/test/java/org/apache/tuscany/sca/host/embedded/impl/EmbeddedSCADomainTestCase.java)中看到。
EmbeddedSCADomain類提供了將運(yùn)行時(shí)的所有部件都集中在單個(gè)虛擬機(jī)里的SCA domain的實(shí)現(xiàn)。創(chuàng)建嵌入式domain很直接:
domain = new EmbeddedSCADomain(cl, domainName);
domain.start();
在domain上調(diào)用start方法會創(chuàng)建所有的運(yùn)行時(shí)工件。特別地,所有的運(yùn)行時(shí)擴(kuò)展,比如implementation , binding , databinding , host會使用java的META-INF/services機(jī)制被加載和初始化。
接下來要做的就是加載SCA應(yīng)用到域中。SCA應(yīng)用被作為contribution部署。Contribution將composite文件(該文件是一個(gè)在SCA裝配規(guī)范中定義的結(jié)構(gòu))所需要的所有資源集合在composite文件中。這些資源可以是java,xml,xsd,swdl等等。EmbeddedSCADomain為讀取contribution提供了一個(gè)contribution服務(wù)。這里有一個(gè)獲取某個(gè)由URL標(biāo)識的contribution的contribution服務(wù)的例子。
ContributionService contributionService = domain.getContributionService();
Contribution contribution = contributionService.contribute("http://calculator",
contributionURL,
null, //resolver,
false);
這個(gè)會在內(nèi)存中生成一個(gè)裝配模型(詳情請查看我翻譯的裝配模型規(guī)范)。你能通過詢問最終生成的contribution來獲取模型的可部署部件。
Composite composite =contribution.getDeployables().get(0);
可部署模型的跟是composite。該composite包含了將運(yùn)行于Tuscany運(yùn)行時(shí)環(huán)境的組件層次信息。以下的各個(gè)步驟讓邏輯裝配模型變成可運(yùn)行的工件,以便讓啟動(dòng)組件。
第一步,將模型composite添加到頂層的本地域控制中。
Domain.getDomainComposite().getIncludes().add(composite);
然后是將邏輯模型的各個(gè)部件連接到一起的構(gòu)建階段,不如對服務(wù)的引用等等。
Domain.getCompositeBuilder().build(composite);
最后基于邏輯模型創(chuàng)建運(yùn)行時(shí)工件,這包括服務(wù)的endpoint和客戶端。
Domain.getCompositeActivator().activate(composite);
一旦所有的工作準(zhǔn)備就緒,域中的每個(gè)composite將獨(dú)立啟動(dòng)。其實(shí)這個(gè)階段,支持web service的servlet都已經(jīng)部署了。
for (Composite composite : domain.getDomainComposite().getIncludes()) {
Domain.getCompositeActivator().start(composite);
}
分布式運(yùn)行時(shí)
當(dāng)域是分布式地跨越多個(gè)VM的時(shí)候,就需要做這步。一旦邏輯模型已經(jīng)經(jīng)過了構(gòu)建階段,有一步是提供給運(yùn)行時(shí)信息的,以便讓遠(yuǎn)程服務(wù)能自動(dòng)地解決跨網(wǎng)絡(luò)的問題。也就是說我們將裝配模型中的所有服務(wù)和引用連起來構(gòu)成一個(gè)分布域的邏輯概念。
distriutedDomain.addDistributedDomainToBindings(composite);