HelloService.java
/**
*服务接口
*
*@author leizhimin 2009-6-215:31:49
*/
public interface HelloService{
StringgetHello(String username);
}
HelloServiceImpl.java
package hello;
/**
*服务实现
*
*@author leizhimin 2009-6-215:32:36
*/
public class HelloServiceImpl implements HelloService{
public StringgetHello(String username) {
return "Hello" +username + "!This is a SCA program!";
}
}
Hello.composite
<!-- SCA的服务组件配置文件 -->
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="Hello">
<component name="HelloServiceComponent">
<implementation.java class="hello.HelloServiceImpl"/>
<property name="username" type="xsd:string" default="World"/>
</component>
</composite>
2、SCA组件的客户端代码
package hello;
/**
*SCA的客户端调用
*
*@author leizhimin 2009-6-2 15:41:41
*/
public class HelloSCAClient{
public static void main(String[]args) {
SCADomainscaDomain =SCADomain.newInstance("Hello.composite");
HelloServicehelloService=
scaDomain.getService(HelloService.class, "HelloServiceComponent");
Stringmsg =helloService.getHello("vcom");
System.out.println(msg);
scaDomain.close();
}
}
五、服务模块
SCA是通过模块(Composite)将SCA组件集成在一起的。
SCA的模块是实际上是将SCA组件(做为零件)重新组合集成度更高的组建,从整体看来SCA模块和SCA组件的结构式一致的。从构成组件的“零件”角度看,SCA模块是用了组件作为零部件重新组装为新的组件(模块)。
其实道理也非常简单,下面是SCA模块的基本原理图:
如上图,可以看到,模块从整体上也是个组件。
模块是通过SCA的配置文件配置组装形成的,不需要程序的硬编码。
提升(Promote):就是将组件的接口、属性、或引用装配为模块的对应的接口、属性或引用。
连线(Wire):就是在模块内部,组件之间的调用关系。比如组件A的实现调用了组件B,那么组件AB间就存在一个连线。
当组件之间需要调用的时候,由于目前组件(如EJB、WS、JMS)传输协议的多样化,这样在相互的调用的时候,需要将绑定不同的协议去调用。这里尽可能避免让人迷惑而又没有价值的绑定(Binding)一词的概念。
六、服务子系统
在一个大的项目里面,可能会有很多服务模块,多个服务模块之间如果需要相互调用,那么就可以将多个服务模块通过WS或者JMS等技术绑定在一起,形成服务子系统。
理解了模块的概念,就不难理解服务子系统了。
七、SCA与JBI的异同
1、相同点
目的是一样的:都是为了集成。
大致方向一样:都是为了将服务和传输协议解耦。
2、 不同点
SCA以接口作为切入点,从组件接口层将传输协议和接口实现解耦,是从编程的角度出发,一种全新的编程模型。
JBI是以请求消息和相应消息作为切入点,在集成时将消息和传输协议解耦,形成一种与传输协议无关的标准消息,这样形成一种全新的区别于现有应用服务器的集成容器,是从容器的角度出发,一种全新的容器模型。
个人观点:
JBI是SUN公司自己的标准,没有得到IBM、Oracle等公司的承认。目前也没有得到商业容器开发商的支持,前景不看好,目前这方面的资料和文档也相当少。个人建议JBI应用方案应该慎用,如果使用SOA,尽可能使用比较成熟的SCA方案。