调出单机的Tuscany运行时
当开始考虑Tuscany SCA java运行时环境的时候,理解高层调用是什么和为什么是非常有用的。当前关于”Domain”对象有些实现,该对象用于启动Tuscany。
DefaultSCADomain –一个简单的域实现,该实现隐藏了大部分的细节。现在为止用于大多数的测试用例。
EmbeddedSCADomain – 用于将Tuscany嵌入到其他的系统中
HotUpdateSCADomain - 当他们改变的时候会自动装载的例子
EmbeddedNode - 分布式域中的一个节点
一般认为EmbeddedSCADomain在调出运行时给出了一个必要的好的入口点。这个类在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类提供了将运行时的所有部件都集中在单个虚拟机里的SCA domain的实现。创建嵌入式domain很直接:
domain = new EmbeddedSCADomain(cl, domainName);
domain.start();
在domain上调用start方法会创建所有的运行时工件。特别地,所有的运行时扩展,比如implementation , binding , databinding , host会使用java的META-INF/services机制被加载和初始化。
接下来要做的就是加载SCA应用到域中。SCA应用被作为contribution部署。Contribution将composite文件(该文件是一个在SCA装配规范中定义的结构)所需要的所有资源集合在composite文件中。这些资源可以是java,xml,xsd,swdl等等。EmbeddedSCADomain为读取contribution提供了一个contribution服务。这里有一个获取某个由URL标识的contribution的contribution服务的例子。
ContributionService contributionService = domain.getContributionService();
Contribution contribution = contributionService.contribute("http://calculator",
contributionURL,
null, //resolver,
false);
这个会在内存中生成一个装配模型(详情请查看我翻译的装配模型规范)。你能通过询问最终生成的contribution来获取模型的可部署部件。
Composite composite =contribution.getDeployables().get(0);
可部署模型的跟是composite。该composite包含了将运行于Tuscany运行时环境的组件层次信息。以下的各个步骤让逻辑装配模型变成可运行的工件,以便让启动组件。
第一步,将模型composite添加到顶层的本地域控制中。
Domain.getDomainComposite().getIncludes().add(composite);
然后是将逻辑模型的各个部件连接到一起的构建阶段,不如对服务的引用等等。
Domain.getCompositeBuilder().build(composite);
最后基于逻辑模型创建运行时工件,这包括服务的endpoint和客户端。
Domain.getCompositeActivator().activate(composite);
一旦所有的工作准备就绪,域中的每个composite将独立启动。其实这个阶段,支持web service的servlet都已经部署了。
for (Composite composite : domain.getDomainComposite().getIncludes()) {
Domain.getCompositeActivator().start(composite);
}
分布式运行时
当域是分布式地跨越多个VM的时候,就需要做这步。一旦逻辑模型已经经过了构建阶段,有一步是提供给运行时信息的,以便让远程服务能自动地解决跨网络的问题。也就是说我们将装配模型中的所有服务和引用连起来构成一个分布域的逻辑概念。
distriutedDomain.addDistributedDomainToBindings(composite);