SCA/Tuscany的一些使用心得(二) -DefaultSCADomain与组合构件(composite)

DefaultSCADomain是多数用于测试使用域,上回SCADomain的源码,默认就会走此实现,

此类针对贡献包,复合组件,组件进行初始化至内存之中;

 

SCADomain调用:

 

// 创建默认的实现

domain
= new DefaultSCADomain(runtimeClassLoader, applicationClassLoader, domainURI, contributionLocation,composites);

// runtimeClassLoader - 域的classLoader(没用)

// applicationClassLoader - 应用的classLoader,主要使用此classLoader运行;

// domainURI - 默认是"http://localhost"

// contributionLocation - 贡献包路径,默认是"/"

// composites - 默认测试是只能编写一个composite配置文件,而DefaultSCADomain构造函数是多参的;

 

DefaultSCADomain:

本对象涉及SCANode和SCAClient,ComponentManager,这里一笔带过,后面会讲解,本次主要叙述本类层次的主流程,

话说回来,源码是要层层的看,当然这是要了解结构和生命周期的读法,debug还是定位到类去看,哈哈;

1.初始化所需的参数:

1.1 处理传参

this.uri = domainURI;

this.composites = composites;

this.applicationClassLoader = applicationClassLoader;

this.domainURI = domainURI;

this.composites = composites;

this.componentManager = new DefaultSCADomainComponentManager(this);

1.2 默认没有贡献包,创建一个贡献包URL集合

this.contributionURLs = new ArrayList<String>();

if (contributionLocation != null && !"/".equals(contributionLocation)) { // 默认没有贡献包,创建;

this.contributionURLs.add(contributionLocation);

}

2.初始化环境:

2.1 创建SCANODE工厂

SCANodeFactory factory = SCANodeFactory.newInstance();

2.2 根据compusite创建SCANodeImp

规则 : 如果拥有多个composite时,将多个composite合并成一个composite;

List<SCAContribution> contributions = new ArrayList<SCAContribution>(); // 创建局部贡献包集合

// 容器内composite多于一个时

if (composites != null && composites.length > 1) {

// 将所有的composite转换至一个composite

String content
= createDeploymentComposite(applicationClassLoader, composites);

// 创建贡献包

for (String location : contributionURLs) {

contributions.add(
new SCAContribution(location, location));

}

node
=

factory.createSCANode(
"http://tuscany.apache.org/xmlns/sca/1.0/aggregated", content, contributions

.toArray(
new SCAContribution[contributions.size()]));

}
else {//只有一个或为null时

for (String location : contributionURLs) {

contributions.add(
new SCAContribution(location, location));

}

// 如果只有一个Composite就获取,不然返回null

String composite
= (composites != null && composites.length >= 1) ? composites[0] : null;

// 创建NodeImpl

if (!contributions.isEmpty()) {

node
=

factory.createSCANode(composite, contributions.toArray(
new SCAContribution[contributions.size()]));

}
else {

// 默认单个compusite

node
= factory.createSCANodeFromClassLoader(composite, applicationClassLoader);

}

}

2.3 强转赋值SCA客户端

client = (SCAClient)node;

2.4 设置端口

setDefaultPort();//设置端口,没有就不设,默认不设置

2.5 启动节点

node.start();//节点启动

2.6 将所有组件添加至组件集合中

getComponents(compositeActivator.getDomainComposite());

3.获取服务

public <B> B getService(Class<B> businessInterface, String serviceName) {

return client.getService(businessInterface, serviceName);

}

源码:

public class DefaultSCADomain extends SCADomain {

private String uri; // 默认是"http://localhost"
private String[] composites; // composites配置文件
// private Composite domainComposite;
// private List<Contribution> contributions;
private Map<String, Component> components; // 组件对象集合
private ComponentManager componentManager;// 组件管理器
// private ClassLoader runtimeClassLoader;
private ClassLoader applicationClassLoader; // 应用ClassLoader
private String domainURI; // 原始domainURI
private List<String> contributionURLs; // 贡献包集合

private CompositeActivator compositeActivator;
private SCANode node;
private SCAClient client;

/**
*
* 创建默认SCA域对象
*
*
@param runtimeClassLoader 域的classLoader(没用)
*
*
@param applicationClassLoader 应用的classLoader,主要使用此classLoader运行;
*
*
@param domainURI 默认是"http://localhost"
*
*
@param contributionLocation 贡献包路径,默认是"/"
*
*
@param composites 默认测试是只能编写一个composite配置文件,而DefaultSCADomain构造函数是多参的;
*
*/
public DefaultSCADomain(ClassLoader runtimeClassLoader,
ClassLoader applicationClassLoader,
String domainURI,
String contributionLocation,
String... composites) {
this.uri = domainURI;
this.composites = composites;
// this.runtimeClassLoader = runtimeClassLoader;
this.applicationClassLoader = applicationClassLoader;
this.domainURI = domainURI;
this.contributionURLs = new ArrayList<String>();
// 默认没有贡献包,创建;
if (contributionLocation != null && !"/".equals(contributionLocation)) {
this.contributionURLs.add(contributionLocation);
}
this.composites = composites;
// 初始化环境
init();

this.componentManager = new DefaultSCADomainComponentManager(this);

}

/**
* A hack to create an aggregated composite
*
@param classLoader
*
@param composites
*
@return
*/
private String createDeploymentComposite(ClassLoader classLoader, String composites[]) {
//.......
}

public void init() {
// TODO 初始化运行环境

// 创建SCANODE工厂
SCANodeFactory factory = SCANodeFactory.newInstance();

List
<SCAContribution> contributions = new ArrayList<SCAContribution>();
// 容器内composite多于一个时
if (composites != null && composites.length > 1) {
// 将所有的composite转换至一个composite
String content = createDeploymentComposite(applicationClassLoader, composites);
// 创建贡献包
for (String location : contributionURLs) {
contributions.add(
new SCAContribution(location, location));
}
node
=
factory.createSCANode(
"http://tuscany.apache.org/xmlns/sca/1.0/aggregated", content, contributions
.toArray(
new SCAContribution[contributions.size()]));
}
else {//只有一个或为null时
for (String location : contributionURLs) {
contributions.add(
new SCAContribution(location, location));
}
// 如果只有一个Composite就获取,不然返回null
String composite = (composites != null && composites.length >= 1) ? composites[0] : null;
// 创建NodeImpl
if (!contributions.isEmpty()) {
node
=
factory.createSCANode(composite, contributions.toArray(
new SCAContribution[contributions.size()]));
}
else {
node
= factory.createSCANodeFromClassLoader(composite, applicationClassLoader);
}
}
client
= (SCAClient)node;
compositeActivator
= ((NodeImpl)node).getCompositeActivator();
components
= new HashMap<String, Component>();

setDefaultPort();
//设置端口,没有就不设,默认不设置

node.start();
//节点启动
// 添加Component至Map<String, Component> components
getComponents(compositeActivator.getDomainComposite());
}
 
  private void setDefaultPort() {
    //..
  }
  
/**
* 获取服务
*/
public <B> B getService(Class<B> businessInterface, String serviceName) {
return client.getService(businessInterface, serviceName);
}

}

组合构件(composite)


组合构件(composite),是最小的独立部署单元,它是组件的容器,是组件、服务、引用以及内连它们的连线的集合体

 

配合看源码 - DefaultSCADomain解析

样例:

<?xml version="1.0" encoding="UTF-8"?>

<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"

xmlns:t
="http://tuscany.apache.org/xmlns/sca/1.0"

xmlns:c
="http://sample"

targetNamespace
="http://sample"

name
="echo">

// targetNamespace - 工作空间名,后期发布绑定用

// name - composite的名字



<component name="echoComponent">

<implementation.java

class="com.simple.echo.EchoImp" />

<service name="Echo">

<binding.ws uri="http://localhost:8080/TrceanyMoudle/echoComponent"></binding.ws>

</service>

<reference name="reture" target="EchoReture"/>

</component>



<component name="EchoReture">

<implementation.java class="com.simple.Client.EchoRetureImp"/>

</component>

</composite>

posted on 2011-05-28 00:19  刄月  阅读(1064)  评论(0编辑  收藏  举报

导航