月蚀传说

浮躁让人失去理智
posts - 25, comments - 101, trackbacks - 0, articles - 0
  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理

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

Posted on 2006-11-27 12:25 Dart 阅读(3460) 评论(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的地方:

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

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


评论

# re: SCA程序设计——Entry Point : 让Web服务发布简单起来  回复  更多评论   

2006-12-01 11:15 by 坏男孩
写的太详细了,,,

# re: SCA程序设计——Entry Point : 让Web服务发布简单起来  回复  更多评论   

2007-01-16 20:35 by teamlet
SCA 规范 0.95已经把Entry Point,Moduel换掉改称为Service,Composite

# re: SCA程序设计——Entry Point : 让Web服务发布简单起来  回复  更多评论   

2007-06-19 16:01 by wsalvin
OSOA已发布 SCA 1.0版 2007-03-15

# re: SCA程序设计——Entry Point : 让Web服务发布简单起来  回复  更多评论   

2007-09-03 21:02 by jackyrong
由于本人公司里存在不少遗留系统,有用java,php,asp,asp.net的四类系统,而且还有不少和合作伙伴的接口程序(之前都是用HTTP来交换数据的),现在而且本人的硕士毕业
论文设计也是做SOA方面的,但目前遇到了一个难题,那就是到底SOA应该如何从开始进行架构设计,如何提炼业务,并且如何将SOA的思想应用到公司的实际系统中,我目前只整理了一下,感觉可以用到SCA/SDO/BPEL/ESB这些东西,ESB打算用MULE的开源,
SCA/SDO打算用APACHE的TUSCANY,但不知道有什么好的架构设计的方法呢?

只有注册用户登录后才能发表评论。


网站导航: