Posted on 2006-11-27 12:25
Dart 阅读(3458)
评论(4) 编辑 收藏 所属分类:
SCA
1.简介
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格式如下:
<
entryPoint
name
="xs:NCName"
multiplicity
="0..1 or 1..1 or 0..n or 1..n"
?
>
*
<
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的地方:
小贴士:在上一篇文章《ExternalService应用》中我已经提到了,Balto SCA是整合了Tomcat,Balto本身就是一个Tomcat容器,只是修改了Tomcat的一些信息,能对部署的Web应用进行SCA方面的一些管理,所以使用Balto SCA就像使用Tomcat一样。
在WTP中新建一个动态Web工程,取名为balto_entrypoint_test
然后我们建立一个接口Cat:
@Remotable
public
interface
Cat {
int
getAge();
float
getWeight();
String getName();
AppearanceTypeImpl getAppearance();
String callingIt(String name);
}
注意,该接口我们利用了SCA的Remotable标签进行标识,这是因为Balto 容器中,对Entry Point所指定的组件接口是有一定要求的,该要求就是要这个组件是一个远程的,所以这里我们需要构建一个Remotable的组件接口
接下来我们做一个类MyCat,实现Cat接口,并且指明该MyCat是一个组件,而服务则接口则是Cat接口,也就是在MyCat类上标明@Service 标签(不明白的读者可以看SCA程序设计第一篇文章 《本地服务》)
@Service(Cat.
class
)
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下),我们在文件中写入:
<?
xml version="1.0" encoding="ASCII"
?>
<
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
小贴士:Balto容器在处理Web服务使用的是Axis2,也就是说纯粹的是通过Axis2的Servlet来处理Web服务请求的,所以,Balto在Web应用启动的阶段,为这些输入SCA管理范围内的Web应用,动态加入了Axis2,而由于目前Balto并不完善,所以在处理Servlet-Mapping的时候,都默认给出了“/sca/services”做为Web服务映射的URL。从上面这段URL可以看出,这是一个请求WSDL文档的URL。
点击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服务中的类型,但示例工程中是有的,有兴趣的朋友可以看一看.
本人文笔有限,有什么不对的地方还请大家指出,谢谢收看,再见。