Axis2 学习笔记二 ( 部署篇 ) .

来源:互联网 发布:国家安全网络宣传周 编辑:程序博客网 时间:2024/04/28 15:59

Axis2 学习笔记二 ( 部署篇 )

 熊红阳

一、 前言  

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

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

< 图二 >

  三、部署描述文件  

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 核心系统中,一个功能模块可以定义为全局的,请求所有服务都能执行到,也可以定义为服务级别,只有请求某个特定的服务才能执行到,或操作级别的,请求某个服务某个操作才能执行到。

  四、静态结构   < 图三 > 

  如图三部署框架主要类图及其关系, 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 可以单独启动提供服务, 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 。

原创粉丝点击