Entry Point是SCA中模块的“入口”。模块可以通过Entry Point将自身定义好的组件(Component)发布成一个可供外部远程访问的服务,这所谓的“远程服务”都是通过一些标准的协议进行访问的,最常见的就是Web服务,所以我们可以这样去理解Entry Point:
Entry Point是将SCA组件发布成各种可供标准远程技术所访问模型,这里的远程访问技术可以是Web Service,JMS或者EJB等。
在这篇文章中,我将介绍如何使用Balto SCA容器,利用Entry Point来将已有的组件发布成一个可用Web服务。对SCA中组件的概念不明白的读者可以先看看SCA程序设计系列的第一篇《本地服务》,或者可以看一下《浅谈SCA》,都能帮助你理解一些SCA基本的概念。
2.如果定义Entry Point
Entry Point的定义是写在sca.module文件中的,它的XML格式如下:
< interface .interface-type />
< binding .binding-type uri ="xs:anyURI" /> +
< reference > wire-target-URI </ reference >
</ entryPoint >
下面简单介绍一下Entry Point的XML文章中各个元素以及属性的含义:
首先是entryPoint的属性 name,这个属性是表示的是该 Entry Point的名称。
interface元素是指entryPoint对应的接口。(读者可以看一下《本地服务》,了解更多interface的信息)
binding元素表示entryPoint在发布该远程服务, 采用的什么样的远程协议进行绑定的。通常情况下都使用的是WebService Binding,除此之外,还有Ejb,JMS的Binding。
reference元素是指该Entry Point将哪个组件做为远程服务发布的实际调用对象。或者我们理解为: 将哪个组件做为远程服务发布了出去。
在这一篇文章中我们只讨论基于Web服务的绑定方式,所以整篇文章中所提到的Binding,都是WebService Binding。
组件通过Entry Point发布出去后,外部就可以通过Entry Point所设置的Binding的具体网络协议对该组件进行访问。也就是说,如果我们想要使本地的一些Java类发布成一个Web Service,那在SCA容器中,只需要将这个Java类做成组件,然后再发布成Web服务绑定的Entry Point;同样我们还可以把它发布成EJB的形式。更重要的是,如果我们在Entry Point中,指定了多种Binding方式,那该组件服务就可以通过多种远程协议进行访问。
3.示例
为了证明Entry Point的确能够帮助开发人员简单地发布Web 服务,这里我们来一个示例工程。
示例工程代码下载 。
准备工作: 下载WTP 1.0 , 下载Balto SCA 。
首先我们将下载好的Balto SCA容器释放到某处,然后在WTP的首选项中,找到Server项,然后添加一个Tomcat 5.5 Runtime,路径指向刚才释放的Balto SCA的地方:
在WTP中新建一个动态Web工程,取名为balto_entrypoint_test
然后我们建立一个接口 Cat:
public interface Cat {
int getAge();
float getWeight();
String getName();
AppearanceTypeImpl getAppearance();
String callingIt(String name);
}
接下来我们做一个类MyCat,实现Cat接口,并且指明该MyCat是一个组件,而服务则接口则是Cat接口,也就是在MyCat类上标明@Service 标签(不明白的读者可以看SCA程序设计第一篇文章 《本地服务》)
public class MyCat implements Cat {
public int getAge() {
return 1 ;
}
public float getWeight() {
return 10.89f ;
}
public String getName() {
return " DuoDuo " ;
}
public AppearanceTypeImpl getAppearance() {
AppearanceType app = AppearanceFactory.eINSTANCE.createAppearanceType();
EyesType eyes = AppearanceFactory.eINSTANCE.createEyesType();
CoatType coat = AppearanceFactory.eINSTANCE.createCoatType();
eyes.setColor( " Deep Blue " );
coat.setColor( " White " );
coat.setHeight( " Height " );
app.setCoat(coat);
app.setEyes(eyes);
return (AppearanceTypeImpl)app;
}
public String callingIt(String name) {
return " Hello " + name + " , MIAO~~~ " ;
}
}
好了,上面的创建好的Cat接口以及MyCat实现类,已经为我们的整个SCA模块生成了一个可用的Component了。
Balto在解析Java Annotation的时候,如果发现了@Service标签,就会主动将这个类注册成为一个Component,并且,该Component的名字是它对应的服务接口的名字,这里也就是Cat。
接下来就是要将这个Component接到Entry Point上,并通过Web服务发布出去。
在工程的src下新建一个sca.module文件(必须在src下),我们在文件中写入:
< module xmlns ="http://www.osoa.org/xmlns/sca/0.9"
xmlns:v ="http://www.osoa.org/xmlns/sca/values/0.9"
name ="balto_entryPoint_test" >
< entryPoint name ="Cat" >
< interface .java interface ="org.uxteam.balto.test.Cat" />
< binding .ws
port ="http://localhost:8080/balto_entrypoint_test/sca/services/LookingCat?
wsdl#wsdl.endpoint(LookingCatService/LookingCatServiceSOAPBinding)" />
< reference > Cat </ reference >
</ entryPoint >
</ module >
这个就是我们所定义的Entry Point:
Web服务名 : Cat
interface:java接口,接口类是Cat接口
binding :Web服务绑定,但后面port给出的信息在目前的Balto版本中是不会关心的。
reference:指定了我们刚才建立的Cat组件。
现在我们打开WTP的Server视图:
新建一个Server,Runtime就是我们的Balto,然后再将刚做的balto_entrypoint_test工程加入到server中,启动!
我们会发现在控制台打出了一些信息,如果没有发生异常,Balto SCA容器就算是启动成功了:
测试Web服务
我们现在需要测试一下发布出去的Web服务是否能用。
首先,打开WTP的Web服务测试Web页面:
然后选择WSDL Page项,我们会发现一下的一个界面,在文本中输入:
http://localhost:8080/balto_entrypoint_test/sca/services/Cat?wsdl
点击GO后我们发现在页面左侧出现了一个树形结构的东西。点开它,呵呵,看见了没,我们发布的Web服务方法全在这儿呢。
随便选择一个,然后在右侧输入参数后点击GO。成功后在Status中我们可以点开Source,查看一下返回的SOAP相信信息。我们拿callIt做个例子:
信息准确无误,成功了。
4.小结
我们这里所提到的Entry Point是在SCA 0.9规范中给出了,而在0.9版本后,Entry Point已经改名了.
通过Entry Point这种"暴露服务"方式,开发人员能够很容易地将自己的Component注册成为一个远程可用的服务,这正是SOA中所提出的那样:服务是可运行在独立节点上的,利用规范的接口描述,让消费者能够在任何地方访问到.SCA中所提出的Entry Point其实就是一个独立服务的访问入口,所以在SCA规范的0.9版本以后Entry Point这个名词就没有再沿用,而是支持将它改为了Service,这更能准确地表明它的性质吧.
本文中并没有具体讲解如何使用XSD中的复杂类型来作为Web服务中的类型,但示例工程中是有的,有兴趣的朋友可以看一看.
本人文笔有限,有什么不对的地方还请大家指出,谢谢收看,再见。