SCA程序设计——Entry Point : 让Web服务发布简单起来

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的地方:

install_balto.JPG


小贴士:在上一篇文章《ExternalService应用》中我已经提到了,Balto SCA是整合了Tomcat,Balto本身就是一个Tomcat容器,只是修改了Tomcat的一些信息,能对部署的Web应用进行SCA方面的一些管理,所以使用Balto SCA就像使用Tomcat一样。


在WTP中新建一个动态Web工程,取名为balto_entrypoint_test

new_wtp_pro.JPG



然后我们建立一个接口 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视图:

new_server.JPG

新建一个Server,Runtime就是我们的Balto,然后再将刚做的balto_entrypoint_test工程加入到server中,启动!

我们会发现在控制台打出了一些信息,如果没有发生异常,Balto SCA容器就算是启动成功了:

balto_entrypoint_console.JPG

测试Web服务

我们现在需要测试一下发布出去的Web服务是否能用。

首先,打开WTP的Web服务测试Web页面:

web_service_explorer.JPG



然后选择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服务方法全在这儿呢。

cat_ws.JPG

随便选择一个,然后在右侧输入参数后点击GO。成功后在Status中我们可以点开Source,查看一下返回的SOAP相信信息。我们拿callIt做个例子:

return_source.JPG

信息准确无误,成功了。

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服务中的类型,但示例工程中是有的,有兴趣的朋友可以看一看.

本人文笔有限,有什么不对的地方还请大家指出,谢谢收看,再见。

你可能感兴趣的:(SCA程序设计——Entry Point : 让Web服务发布简单起来)