NCName"
(type="xs:
QName"|element="xs:
QName")?
mustSupply="xs:
boolean"?
many="xs:
boolean"?
source="xs:
string"?
file="xs:
anyURI"?
>*
property-value?
Component元素有如下属性:
•name(必须)–构件的名字。
在同一组合构件里的所有构件中名字必须唯一。
•autowire(可选)–指示包含的构件引用是否自动连线,默认是false。
•requires(可选)–策略意图的列表。
(策略框架规范)
•policySet(可选)–策略集列表。
(策略框架规范)
•constrainingType(可选)–强制类型的名字。
当指定时,构件的服务、引用和属性的集合,加之相关的意图将被限定为强制类型定义的集合。
component元素有0个或者1个implementation子元素,该子元素指定构件所使用的实现。
Service
component元素有0个或多个service子元素,用于配置构件的服务。
可配置的服务是由实现定义的。
service元素有如下属性:
•name(必须)–服务名字。
必须匹配由实现定义的服务名。
•requires(可选)--策略意图的列表。
•policySets(可选)--策略集列表。
service元素有0个或者1个interface子元素。
如果没有指定接口,那么实现为服务指定的接口有效。
如果指定了接口,就必须提供一个与实现提供的接口相兼容的子集。
service元素有0个或多个binding子元素。
如没有指定binding,那么实现为服务指定的binding有效。
如果指定了,那些绑定会覆盖实现所指定的绑定。
Reference
component元素有0个或多个reference子元素,用于对其他服务的引用。
reference元素有如下属性:
•name(必须)–引用名。
必须匹配实现中定义的引用名称。
•autowire(可选)–指示引用是否自动连线,默认是false。
•requires(可选)–策略意图的列表。
•policySet(可选)–策略集列表。
•multiplicity(可选)–定义了能连接到目标服务的引用的连线数目。
1..1,0..1,1..n,0..n
•target(可选)–一个或多个目标服务URI的列表,依赖于multiplicty的设置。
•wiredByImpl(可选)–一个boolean值。
默认”false”,指示实现动态地连线该引用。
如果设置为“true”,表示这个引用的目标由实现代码在运行时设置。
reference元素有0个或者1个interface子元素。
(含义与service中相同)
reference元素有0个或多个binding子元素。
(含义与service中相同)
component元素有零个或多个property子元素。
该子元素用于配置实现的属性数据值。
其值可以通过多种方式获得。
(属性元素直接赋值;通过引用包含该component的composite中某个属性来赋值;通过文件赋值)
component的SCDL文档例子
该例子是一个由两个component构成的composite,实现加法计算器功能,结构如下:
AddServiceComponent实现加法功能,采用AddService接口,即其它本地类可以以AddService接口调用它
CalculatorServiceComponent实现CalculatorService接口(其它本地类可以以CalulatorService接口调用它),且其实现类调用了AddService接口(本地方式)
注:
该例子中的连线都是本地方式,通过SCA的装配方式,可以直接完成接口到具体实现的对应,不用从Java代码中新建接口类,指定接口的实现。
例1:
(例1作为第一个SCDL文档学习,会比较详细)
定义了一个名为AddServiceComponent的构件,并指定了它的实现类。
AddServiceImpl代码如下:
publicclassAddServiceImplimplementsAddService{
publicdoubleadd(doublen1,doublen2){
returnn1+n2;
}
}
现在需要定义一个新的构件,名称为CalculatorServiceComponent。
该构件需要引用AddServiceComponent构件。
首先,我们定义一个名为AddService的Interface和一个名为CalculatorService的Interface
代码如下:
publicinterfaceAddService{
doubleadd(doublen1,doublen2);
}
publicinterfaceCalculatorService{
doubleadd(doublen1,doublen2);
}
相应的,在实现CalculatorServiceComponent构件的java文件
CalculatorServiceImpl.java中,应有以下代码:
publicclassCalculatorServiceImplimplementsCalculatorService{
privateAddServiceaddService;
@Reference
publicvoidsetAddService(AddServiceaddService){
this.addService=addService;
}
publicdoubleadd(doublen1,doublen2){
returnaddService.add(n1,n2);
}
}
代码中使用了@Reference注释,表明该方法中含有引用。
而在CalculatorServiceComponent构件的SCDL文档部分,应该有以下内容:
指定了实现类,指明了reference的服务名称是addService(对应代码中,即是方法setAddService中的参数addService。
此处的名称一定要一致,不然引用会失败),并且指明了addService的target是AddServiceComponent。
最后将这两个component装配成一个composite。
完整的SCDL文档如下:
//www.osoa.org/xmlns/sca/1.0"
targetNamespace="http:
//sample"
xmlns:
sample="http:
//sample"
name="Calculator">
测试调用:
编写一个测试类
publicclassCalculatorClient{
publicstaticvoidmain(String[]args)throwsException{
SCANodeFactoryfactory=SCANodeFactory.newInstance();
SCANodenode=
factory.createSCANodeFromClassLoader("Cposite",CalculatorClient.class.getClassLoader());
node.start();
//初始化部分将在SCA规范JAVA实现部分中进一步学习
CalculatorServicecalculatorService=
((SCAClient)node).getService(CalculatorService.class,"CalculatorServiceComponent");
//Calculate
System.out.println("3+2="+calculatorService.add(3,2));
node.stop();
}
}
运行后得到结果:
2010-12-2019:
36:
30org.apache.tuscany.sca.node.impl.NodeImpl
信息:
Creatingnode:
Cposite
2010-12-2019:
36:
30org.apache.tuscany.sca.node.impl.NodeImplconfigureNode
信息:
Loadingcontribution:
file:
/D:
/tuscany-sca-1.6.1-src/samples/calculator/target/classes/
2010-12-2019:
36:
31org.apache.tuscany.sca.node.impl.NodeImplstart
信息:
Startingnode:
Cposite
3+2=5.0
2010-12-2019:
36:
31org.apache.tuscany.sca.node.impl.NodeImplstop
信息:
Stoppingnode:
Cposite
该例子通过代码中的@Reference以及SCDL中对reference元素name属性和target属性的定义,将AddService接口的实例addService链接到了接口的实现部分(AddServiceImpl.java)。
例2:
同样是例1中的calculator加法功能,这次我们用ws的方式提供add服务,这需要在接口AddService中添加@Remotable注释:
@Remotable
publicinterfaceAddService{
doubleadd(doublen1,doublen2);
}
同时,在其实现类中添加@Service注释
@Service(AddService.class)
publicclassAddServiceImplimplementsAddService{
publicdoubleadd(doublen1,doublen2){
returnn1+n2;
}
}
调用该服务的CalculatorServiceImpl.java不用做任何改动。
而相应的,SCDL文档改为:
//www.osoa.org/xmlns/sca/1.0"
targetNamespace="http:
//sample"
xmlns:
sample="http:
//sample"
name="Calculator">
//localhost:
8080/sample-calculator-ws-webapp/AddServiceComponent"/>
AddServiceComponent构件中声明了服务,该服务的接口名称以及该服务的绑定协议。
CalculatorServiceComponent构件中指明了引用服务的接口名称,绑定协议以及该ws服务的具体接入点(uri)
该例子通过@Remotable注释和@Service注释的使用,结合reference元素和service元素中interface子元素和binding子元素的帮助,完成了对于一个ws服务的调用。
Composite
Composite被用于在逻辑分组中装配SCA元素。
其在SCA域中是组合的基本单元。
SCA组合构件包含一系列的Componet,Service,Reference以及内连它们的wire和像外部暴露它们的promotion,外加上用于配置构件的一系列property。
composite元素有如下属性:
•name(必须)–组合构件的名字。
组合构件名字的形式是一个XMLQName,在由targetNamespace属性标识的命名空间中。
•targetNamespace(可选)–composite声明所在的目标命名空间标识符
•local(可选)–composite中的所有component是否必须运行于同一个操作系统进程。
Local=”true”指示所有的构件运行于同一进程。
Local=”false”,是默认值,指示composite里的不同的构件运行于不同的操作系统进程,这些component可能运行在某个网络的不同节点上。
•autowire(可选)–被包含的构件引用是否自动连线,默认为false。
•constrainingType(可选)–constrainingType的名字。
当指定的时候,组合构件的服务,引用和属性的集合,再加上相关的意图,都会受限于costrainingType所定义的设置。
•requires(可选)–策略意图的列表。
•policySets(可选)–策略集列表。
composite包含0个或多个property,service,component,reference,wire以及includedcomposites。
Composite与Component关系:
Component包含配置化的实现,该实现承载其Composite的业务逻辑。
Component提供服务并引用其他的服务。
Composite定义了Composite所提供的公开服务,这些服务能被Composite的外部访问(采用promotion)。
Composite引用描述该Composite依赖于其外部其他地方所提供的服务。
wire描述Composite中的Component服务与Component引用之间的连接。
关于promotion:
Composite级别的服务是对该Composite中某一个Component的某一服务的提升。
即Composite服务实际上是由其内部的一个Component所提供的。
Composite级的引用是对一个或多个Component的一个或多个引用的提升。
注:
只要所有的Component引用相互兼容,多个Component引用能被提升为同一个Composite的引用。
在多个Component引用被提升为同一个Composite的引用的地方,它们都共享相同的配置,包括相同的目标服务。
Composite中的reference元素:
与component中的reference类似,当多了一个promotion的子元素,且在composite的reference中,promotion子元素是必须的。
•promote(必须)–标识一个或多个被提升的构件引用。
该值是用空格分隔的,形式为
/的值的列表。
如果构件只有一个引用,那么对引用名的指定是可选的。
另外,composite的引用可选地指定一个接口(interface),multiplicity