Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6643095
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: 系统运维

2011-05-12 22:59:39

Axis2的灵活性和扩展性主要集中在它的部署描述符上。因为所有这些描述符是基于XML的,XML本身的可扩展性自然也影响了Axis2。在Axis2中有如下三种主要部署描述符:

  • 全局描述符(axis2.xml)
  • 服务描述符(services.xml)
  • 模块描述符(module.xml)

运行Axis2需要的所有全局性配置(全局参数、传输信息等等)都在axis2.xml中给出。最有意思的是,可以在axis2.xml中配置部署行为,也就是说可以以想要的方式来配置“热部署”和“热更新”参数,如下所示。

true
false

同样的, 所有全局的参数、模块、传输信息等等都可以在axis2.xml中进行配置在axis2启动时,会在发布目录中查找axis2.xml,如果找到,系统 就会使用它来进行配置;否则,就将默认参数(随axis2发行版本发布)复制到发布目录中,并且系统使用这些来进行配置。之后,在用户需要时,也可以改变 axis2.xml。这里要记住一件事,要使任何改动生效,都需要重启系统。(关于axis2.xml的详细解释超出本文范围。)

Axis2服务

如果您是一位Axis1.x的用户,那肯定对如何使用Axis1.x部署服务很熟悉。假设你正使用Axis1.x,那发布一个服务最简单的方式就是应用Axis1中的即时Web service。

  • 写一个带有你想发布出来的方法的java类(假设Mysevice.java)。
  • 把这个java类放到Axis应用目录下。
  • 重命名这个java类为Myservice.jws(因为要发布的类名是Myservice.java)。
  • 重启Axis应用之后,这个Web service就发布出来了。

用Axis1.x发布web service就这么简单吗?如果你要发布一个很简单的服务,那么是的,就这些。然而,

  • 你的服务可能由超过一个的类来实现
  • 你要提供服务特定的参数
  • 你想提供服务特定的类库

使用Axis1.x来完成发布工作也不是不可能,不过有很多艰苦的工作要做,尤其是对一般用户特别是对初学者来说。在这种情形下,用户不得不专门写 一个叫做WSDD的部署描述符,把它提供给Axis管理端。管理端完在服务器上成完成修改(也是通过Web service),但是为了服务能够工作,需要修改服务器的类路径,一般情况下这需要重启服务器。

因此,为了处理Axis1.x在部署上的缺点Axis2被开发出来,并且提供了一个更好的部署机制。其结果就是,在Axis2中,如果你可以创建一个正确的服务存档(Axis2带了一个创建存档文件的工具,所以创建服务存档文件并不是什么困难的工作)。在Axis2中部署一个服务只不过是把存档文件放到Axis2发布目录的services子目录下。如果你在像tomcat之类的应用服务器上应用Axis2,可以使用web接口来发布服务。

下面是在Axis2中不用工具手写Web service的方法:

  • 如果你已经有了将要发布的服务的WSDL文件, 那么就用WSDL2Java来创建一个服务骨架。
  • 然后,以你喜欢的方式完成(或者说填充)服务骨架。
  • 如果你没有服务的骨架类也不用担心。写一个服务实现类,这里它就是服务的骨架类。

接下来,写一个services.xml,也就是服务的配置文件。下面是一个services.xml文件的模板:


   
       The description of the service goes here; this can be any   XML element
   

   
       org.apache.axis2.MyServiceImpl
   

   
       ServicePara
   

    <operation name="myOperation">
      
          OperationParaValue
      

    operation>
写services.xml的步骤
  1. 这里有一个叫做ServiceClass的特殊参数。把它设置为服务实现类的名字。这个类可以是服务骨架类或者是服务实现类。
  2. 对应服务骨架或者实现类的每个方法,都应该有一个operation元素。例如,如果在服务实现类中有个叫做“myOperation”的方法,那就应该像上面那样在配置文件中放一个operation元素。
  3. 在services.xml的任何地方都可能有特定于服务的参数。在运行时,这些参数可以在ServiceDescription或者OperationDescription中获得。
注意:上面的服务配置是非常简单的,实际应用中的配置文件可能要比这复杂的多。
注意:Axis2正着手在Web service中引入服务组的概念,以便用户能够在一个存档文件中发布数个服务,并且数据能够在这些服务之间共享。本文仅仅描述了单独一个服务如何部署。

下一步是把上面这些文件打包到一个存档文件中,可以用下面步骤来完成。(如果你正使用IntelJ IDEA或者eclipse,可以从Axis2的网站下载这些IDE的插件,他们可以让你的工作变得简单)

  1. 建立一个空目录(名字随意)。
  2. 在其中建立一个叫“META-INF”的目录。
  3. 把services.xml放到META-INF目录下。
  4. 如果你有对应于Web service的WSDL文件,把他们重命名为service.wsdl,也放到同一个目录下。(在Axis2中wsdl文件并不是必须的。)
  5. 如果你需要第三方的库文件或者有自己的库文件,建立一个名为lib和META-INF同级的目录,把你所有的库文件放里面。
  6. 把编译好的服务实现类复制到该目录下。
  7. 用这些文件创建一个以*.jar或者*.aar命名的zip文件。

目录结构看起来如图4所示。

图4 Axis2服务子目录层次结构

注意:如果使用高于0.91的Axis2版本,也可以不创建存档文件,直接把服务目录放到Axis2发布目录下的services子目录下。

注意:正如上面提到的,Axis2发布一个服务时wsdl文件并不是必须的,但是如果有wsdl文件,那么可以 提供更多的功能或者更高的配置性。如果存档文件包含一个wsdl文件,发布机制就会用这个wsdl建立一个WSDL对象模型(WOM)然后使用 services.xml设置其余参数。如果没有wsdl文件,就会建立一个空的WOM,用services.xml设置其余参数。

Axis2服务扩展(模块)

在Apache的Axis中,服务扩展是个全新的概念,但在Axis1.x中,开发人员通过一些艰苦的工作也能在功能上达到服务扩展或者说模块的目 的。模块是一种能嵌入正在运行的系统,然后做一些额外工作的东西。从某种角度来说,模块在大多数情况下可以看作是一组绑定在一起提供某些特定功能的 handler的集合,它实现了Web service规范。

这个想法非常简单。假设你要支持WS-Addressing,你要做的只是下载它的模块然后把他们放在Axis发布目录下的modules目录中。 如果你想让模块的功能在全局生效,把下面的配置条目加入axis2.xml;或者,如果你只是想它在某个特定的服务中生效,那就把这个配置条目加入那个服 务的services.xml中。

在上例中ModuleName=addressing。

注意:在Axis2中,WS-Addressing是默认支持的,因此你不必做任何事。事实上,寻址是全局生效的,自然的每个服务都有寻址功能。

同样的场景也适用于WS-Security、WS-RM,等等。

创建模块存档文件基本上和创建服务存档文件是一样的;唯一的不同是模块存档包含module.xml做为它的配置文件。另外,模块可能包含一个模块 实现类,当然也可能不包含,不过作为一个模块至少应该包含一个处理器(handler)(在发布时并不检查这些,但是如果模块一个handler都不包含,那它根本就不会起作用)。下面是module.xml的模板:


    flow>
      
         
      

      
         
      

   
flow>
    flow>
       Out Flow handlers go here
   
flow>
    flow>
       Out fault flow handler go here
   
flow>
    flow>
       In fault flow handlers go here
   
flow>

    ModuleParaValue


      
注意:如果你有一个模块实现类,class属性要写全路径类名。如果module.xml中配置了一个模块实现类,它的init方法会在发布时由部署机制调用。

像你看见的一样,这里有一些称为**flow的元素。在module.xml中,他们主要用来配置Axis2的消息路径。为了更好的写 module,你需要很好的理解在模块配置中的所有元素,解释这些配置元素超出了本文范围。在Axis2网站上能找到关于这些的资料,在写任何模块之前, 你最好先看看他们。

对于服务,虽然不用创建存档就能部署(直接发布目录,见上文),但对模块并不适用。对于一个在Axis2中可用的模块来说:1它应该是存档文件(*.mar或者*.jar),2它必须放在如下面图5所示的目录层次中。

图5:Axis2模块子目录层次结构

注意:不一定非要把模块存档文件放在模块子目录下,如果在类路径下有模块存档文件,可以通过 在任何地方(可能是axis2.xml或者services.xml)中放一个条目来达到应用模块的目的,部署引擎会从类路径中读取模块,并把他们复制到模块目录中。
在Axis2中发布服务的可选方式

在Axis2中有两种发布服务的方式。一种是把服务存档文件放到Axis2发布目录的services子目录下;另一种是通过编程的方式发布。基于发布目录的部署方式的基本内容上面已经提到了,这也是发布服务最普通的方式。

通过编程的方式发布服务并不是真正的用户需求,但它是模块作者的一种需求,有些模块需要你发布一个提供模块所有功能的web service。用编程的方式创建服务,你需要services.xml文件,一个能够加载你的服务类文件的类加载器(或者CCL)和 ServiceDescription(Axis2中服务的静态表示)。下面的代码片断应该对你理解编程式的服务发布有所帮助。

DeploymentEngine de = new DeploymentEngine();
ServiceDescription service = new ServiceDescription();
ClassLoader cls = Thread.currentThread().getContextClassLoader();
InputStream in = new FileInputStream("location of servie.xml");
de.buildService(service,in,cls);
       结论

Axis2并不仅仅是为了验证Web service概念,而是为了提供更好的SOAP处理模型。和Axis1.x(或者其他已存在的web service引擎)相比Axis2在速度和内存两方面都有相当可观的性能提高。另外,Axis2提供了一种方便用户使用的部署机制。


阅读(1152) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~