Axis2 学习笔记二 ( 部署篇 )

一、 前言  
 

  前一节我们研究了 Axiom, 了解了 axis2 的 xml 的处理机制, axis2 类似诸多 apache 开源软件,采用 xml 文件方式来配置管理,只不过 axis2 使用了本身的 Axiom 来读取配置文件。与 axis1.x 相比, axis2 部署增加了热部署及热更新的功能,这两个功能已不是什么新名词,热部署可以使 axis2 在运行时部署新的 webservice ,而热更新使得在不需要重新启动 axis2 的基础上更新已部署的 webservice 有效。

二、整体架构  
 
Axis2 学习笔记二 ( 部署篇 )_第1张图片
 
< 图一 >
  Scheduler :日程管理器,隔一段时间通知监听器查看部署文件。
  Listener : :部署文件监听器,负责查看更新状况并实时更新系统。
  Descriptor Parser :基于 Axiom ,对部署描述 xml 文件进行处理。
  Deployment Engine: 部署引擎,可理解为一个部署管理中心组件,负责所有部署相关逻辑。
  Axis2 Core : Axis2 的核心系统,不依赖于部署系统,同时部署系统也不依赖于核心系统。
  Repository: 相当于一个部署文件的根目录,也是监听器需要监听的路径,其下有两种重要的目录, services 和 modules , services 下存放要部署的 axis2 webservice , modules 下存入 要部署的 axis2 的功能模块,如下图二 Repository 的概念有如 Axis2 Repository 所处的位置。
   
 
Axis2 学习笔记二 ( 部署篇 )_第2张图片
 

< 图二 >

   
三、部署描述文件  
 

Axis2 的部署描述文件共分三种:

  • 全局 部署 描述文件 (axis2.xml)
  • Axis2 Webservice 部署 描述文件 (services.xml)
  • Axis2 功能模块 部署 描述文件 (module.xml)
    全局都放在 a xis2.xml 文件中,比如一些 全局参数(如是否支持热部署),支持各种协议的消息发送类等, axis2 启动时会首先找这个文件,如果在 repository 中找不到,会加载类路径下缺省的 axis2_default.xml 文件。
    services.xml 用于部署用户定义的 webservice ,在 Axis1.x 中,部署自己的一下 service 是比较麻烦的, axis2 这方面改进得比较好,首先写一个自己的业务类,不需要实现任何接口,然后在 services.xml 文件对自己所要提供服务的方法设置就 ok 了 , 其典型格式如下:
 

<serviceGroup>

<service >

<description>

The description

</description>

<parameter name="ServiceClass" locked="false"> org.apache.axis2.MyServiceImpl </parameter>

<operation name="query">

<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>

</operation>

</service>

</serviceGroup>

 

  最外边serviceGroup代表一组服务,其间可以容纳多个 service , service 就代表一个用户定义的一个服务, description 是该服务一个简单描述,没有什么实际意义, parameter 这里定义一个比较重要的参数 ServiceClass ,既用户自己写的提供服务的简单的 javaBean , operation 声明这个服务对外提供具体的操作, name 指操作名,注意这个操作名在自己的 ServiceClass 中必须存在这样一个 public 的方法, messageReceiver 定义这个操作的消息接收类,这个class使用的选择与用户自定义的服务运行方式有关,Axis2提供了两种主要的MEP(消息交换方式):IN-ONLY(收到请求执行某一操作),IN-OUT(收到请求执行某一操作后返回一个响应消息纵给客户端),这里选择RawXMLINOutMessageReceiver表示采用IN-OUT这种方式。

   
 

  最后还有 module.xml ,这也是 axis2 一个比较有特色的地方,用户可以自己开发对 soap 消息处理的功能块,可以很方便地加入到 axis2 核心系统中,一个功能模块可以定义为全局的,请求所有服务都能执行到,也可以定义为服务级别,只有请求某个特定的服务才能执行到,或操作级别的,请求某个服务某个操作才能执行到。

   
四、静态结构  
  Axis2 学习笔记二 ( 部署篇 )_第3张图片
  < 图三 >
 

  如图三部署框架主要类图及其关系, DeploymentEngine 起一个集成各功能类的作用, ArchiveFileData 代表一个部署打包的文件, AxisConfiguration 的实例存在 Axis2 启动配置的静态数据, DescriptionBuilder 负责解析 xml 文件, ArchiveReader 调用 DescriptionBuilder 而已, RepositoryListener repository 的监听类, Scheduler 和 SchedulerTask 配合按一段时间间隔对 repository 进行扫描是否改变,如果改变通过 RepositoryListener 对实施重新部署文件, WSInfoList 主要是分担一部分 RepositoryListener 的职责。

 

  Axis2 中有两种部署服务的办法,一种服务打包文件放到 Repository 的 services 目录下,另外一种还可以用编程方法部署,比如:

  DeploymentEngine developer = new DeploymentEngine();
  ServiceDescription service = new ServiceDescription();
  ClassLoader cls = Thread.currentThread().getContextClassLoader();
  InputStream in = new FileInputStream("location of servie.xml");
  developer.buildService(service,in,cls);
   
五、 动态加载次序  
Axis2 学习笔记二 ( 部署篇 )_第4张图片
 

< 图四 >

   
 

  Axis2 可以单独启动提供服务, Axis2 提供了一下 org.apache.axis2.transport.http.SimpleHTTPServer 类来启动整个系统,但一般实际应用将 Axis2 和 Servlet Container 绑定在一起(我想主要是成熟的 Servlet Container 在多线程管理方面更加稳定同时也便于与 web application 进行交互),上图四就是一个 Axis2 由 Servlet 引导启动的时序,首先当然是 Servlet Container 调用 AxisServlet 的 init(ServletConfig) 方法,总的次序是:先加载 axis2.xml 全局配置,其次加载 repository 下 modules ,最后加载 services 。

 

转自:http://blog.csdn.net/eastbear2008/archive/2006/08/23/1108145.aspx

你可能感兴趣的:(xml,应用服务器,webservice,servlet,配置管理)