Axis2可以通过模块(Module)进行扩展。Axis2模块至少需要有两个类,这两个类分别实现了Module和Handler接口。开发和使用一个Axis2模块的步骤如下:

1. 编写实现Module接口的类。Axis2模块在进行初始化、销毁等动作时会调用该类中相应的方法)。

2. 编写实现Handler接口的类。该类是Axis2模块的业务处理类。

3. 编写module.xml文件。该文件放在META-INF目录中,用于配置Axis2模块。

4. 在axis2.xml文件中配置Axis2模块。

5. 在services.xml文件中配置Axis2模块。每一个Axis2模块都需要使用<module>元素引用才能使用。

6. 发布Axis2模块。需要使用jar命令将Axis2模块压缩成.mar包(文件扩展名必须是.mar),然后将.mar文件放在

<Tomcat安装目录>\webapps\axis2\WEB-INF\modules目录中。    
    先来编写一个WebService类,代码如下:

package service;

public 
class MyService

{

    
public String getGreeting(String name)

    {

        
return "您好 " + name;

    }

}

下面我们来编写一个记录请求和响应SOAP消息的Axis2模块。当客户端调用WebService方法时,该Axis2模块会将请求和响应SOAP消息输出到Tomcat控制台上。

第1步:编写LoggingModule类

LoggingModule类实现了Module接口,代码如下:

package module;

import org.apache.axis2.AxisFault;


import org.apache.axis2.context.ConfigurationContext;


import org.apache.axis2.description.AxisDescription;


import org.apache.axis2.description.AxisModule;


import org.apache.axis2.modules.Module;


import org.apache.neethi.Assertion;


import org.apache.neethi.Policy;

public 
class LoggingModule 
implements Module

{

    
//
 initialize the module

    
public 
void init(ConfigurationContext configContext, AxisModule module)

            
throws AxisFault

    {

        System.out.println("init");

    }

    
public 
void engageNotify(AxisDescription axisDescription) 
throws AxisFault

    {

    }

    
//
 shutdown the module

    
public 
void shutdown(ConfigurationContext configurationContext)

            
throws AxisFault

    {

        System.out.println("shutdown");

    }

    
public String[] getPolicyNamespaces()

    {

        
return 
null;

    }

    
public 
void applyPolicy(Policy policy, AxisDescription axisDescription)

            
throws AxisFault

    {

    }

    
public 
boolean canSupportAssertion(Assertion assertion)

    {

        
return 
true;

    }

}

在本例中LoggingModule类并没实现实际的功能,但该类必须存在。当Tomcat启动时会装载该Axis2模块,同时会调用LoggingModule类的init方法,并在Tomcat控制台中输出“init”。

第2步:编写LogHandler类

LogHandler类实现了Handler接口,代码如下:

package module;

import org.apache.axis2.AxisFault;


import org.apache.axis2.context.MessageContext;


import org.apache.axis2.engine.Handler;


import org.apache.axis2.handlers.AbstractHandler;


import org.apache.commons.logging.Log;


import org.apache.commons.logging.LogFactory;

public 
class LogHandler 
extends AbstractHandler 
implements Handler

{

    
private 
static 
final Log log = LogFactory.getLog(LogHandler.
class);

    
private String name;

    
public String getName()

    {

        
return name;

    }

    
public InvocationResponse invoke(MessageContext msgContext)

            
throws AxisFault

    {

        
//
  向Tomcat控制台输出请求和响应SOAP消息

        log.info(msgContext.getEnvelope().toString());

        
return InvocationResponse.CONTINUE;

    }

    
public 
void revoke(MessageContext msgContext)

    {

        log.info(msgContext.getEnvelope().toString());

    }

    
public 
void setName(String name)

    {

        
this.name = name;

    }

}

LogHandler类的核心方法是invoke,当使用该Axis2模块的WebService的方法被调用时,LogHandler类的invoke方法被调用。

第3步:编写module.xml文件    

在META-INF目录中建立一个module.xml文件,内容如下:

<
module 
name
="logging"
 class
="module.LoggingModule"
>

    
<
InFlow
>

        
<
handler 
name
="InFlowLogHandler"
 class
="module.LogHandler"
>

            
<
order 
phase
="loggingPhase"
/>

        
</
handler
>

    
</
InFlow
>

    
<
OutFlow
>

        
<
handler 
name
="OutFlowLogHandler"
 class
="module.LogHandler"
>

            
<
order 
phase
="loggingPhase"
/> 

        
</
handler
>

    
</
OutFlow
>

<
OutFaultFlow
>

        
<
handler 
name
="FaultOutFlowLogHandler"
 class
="module.LogHandler"
>

            
<
order 
phase
="loggingPhase"
/>

        
</
handler
>

    
</
OutFaultFlow
>

    
<
InFaultFlow
>

        
<
handler 
name
="FaultInFlowLogHandler"
 class
="module.LogHandler"
>

            
<
order 
phase
="loggingPhase"
/>

        
</
handler
>

    
</
InFaultFlow
>


</
module
>

第4步:在axis2.xml文件中配置Axis2模块

打开axis2.xml文件,分别在如下四个<phaseOrder>元素中加入<phase name="loggingPhase"/>:

<
phaseOrder 
type
="InFlow"
>

    
 



    <
phase 
name
="soapmonitorPhase"
/>


    <
phase 
name
="loggingPhase"
/>


</
phaseOrder
>


<
phaseOrder 
type
="OutFlow"
>

    
 


    
<
phase 
name
="Security"
/>

    
<
phase 
name
="loggingPhase"
/>


</
phaseOrder
>


<
phaseOrder 
type
="InFaultFlow"
>

    
 


    
<
phase 
name
="soapmonitorPhase"
/>

    
<
phase 
name
="loggingPhase"
/>


</
phaseOrder
>


<
phaseOrder 
type
="OutFaultFlow"
>

    
 


    
<
phase 
name
="Security"
/>

    
<
phase 
name
="loggingPhase"
/>


</
phaseOrder
>

第5步:在services.xml文件中引用logging模块

services.xml文件的内容如下:

<
service 
name
="myService"
>

    
<
description
>

        使用logging模块

    
</
description
>

    
<!--
  引用logging模块  
-->

    
<
module 
ref
="logging"
/>

    
<
parameter 
name
="ServiceClass"
>

        service.MyService   

    
</
parameter
>

    
<
messageReceivers
>

        
<
messageReceiver 
mep
="http://www.w3.org/2004/08/wsdl/in-out"

            class
="org.apache.axis2.rpc.receivers.RPCMessageReceiver"
 
/>

    
</
messageReceivers
>


</
service
>

第6步:发布logging模块

到现在为止,我们应用可以建立两个发行包:logging.mar和service.aar。其中logging.mar文件是Axis2模块的发行包,该包的目录结构如下:

logging.mar

module\LoggingModule.class

module\LogHandler.class

META-INF\module.xml

service.aar文件是本例编写的WebService发行包,该包的目录结构如下:

service.aar

service\MyService.class

META-INF\services.xml

将logging.mar文件放在<Tomcat安装目录>\webapps\axis2\WEB-INF\modules目录中,将service.aar文件放在<Tomcat安装目录>\webapps\axis2\WEB-INF\services目录中。要注意的是,如果modules目录中包含了modules.list文件,Axis2会只装载在该文件中引用的Axis2模块,因此,必须在该文件中引用logging模块,该文件的内容如下:

addressing-1.4.1.mar

soapmonitor-1.4.1.mar

ping-1.4.1.mar

mex-1.4.1.mar

axis2-scripting-1.4.1.mar

logging.mar

如果modules目录中不包含modules.list文件,则Axis2会装载modules文件中的所有Axis2模块。

现在启动Tomcat,使用如下的C#代码调用MyService的getGreeting方法则会在Tomcat控制台中输出相应的请求和响应SOAP消息。

//
  async是引用MyService的服务名

async.myService my = 
new WSC.asyn.myService();

MessageBox.Show(my.getGreeting("中国"));

MessageBox.Show("完成调用");

在执行上面的代码后,在Tomcat控制台中输出的信息如下图所示。

Axis2(9):编写Axis2模块(Module)的更多相关文章

  1. 使用AndroidStudio编写APICloud模块需要注意的地方,解决模块未定义。

    在新的版本下,使用AndroidStudio编写APICloud模块,已经非常简单了,解决模块未定义,最重要的就是要先看官方的视频! 注意在模块的module.json中name很重要,建议做到三统一 ...

  2. Python中模块(Module)和包(Package)的区别

    本文绝大部分内容转载至:廖雪峰官方网站 1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函 ...

  3. 00.模块1.模块(Module)和包(Package)

    转自廖雪峰老师官方网站 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件 ...

  4. Saltstack_使用指南09_远程执行-编写执行模块

    1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...

  5. 21.python的模块(Module)和包(Package)

    目录 模块(Module)和包(Package) 模块(modue)的概念 模块导入方法 1.import 语句 2.from-import 语句 3.from-import* 语句 4.运行本质 i ...

  6. 15_Python的模块module

    1.模块的概述 1.模块是Python程序架构的一个核心概念,每一个以.py结尾的Python源代码文件都是一个模块 2.模块名和标识符的命名规则一样,由数字字母下划线组成且不能以数字开头,也不要和系 ...

  7. 【转】PowerShell入门(十一):编写脚本模块

    转至:http://www.cnblogs.com/ceachy/archive/2013/03/08/PowerShell_Script_Module.html 现在通过编写模块就可以在PowerS ...

  8. [转]使用 C 编写 Lua 模块

    Lua 作为一种小巧的语言,一般都是嵌入到 C/C++ 中作为扩展语言,但是也可以作为独立的脚本语言使用,并且可以使用 C/C++ 编写扩展模块.在参考资料 [1] 中有怎样用 C/C++ 编写模块的 ...

  9. 用Perl编写Apache模块续二 - SVN动态鉴权实现SVNAuth 禅道版

    代码地址:https://code.csdn.net/x3dcn/svnauth 以禅道项目管理系统的数据库结构为标准,实现了可用的svn authz验证功能. 以用户名.密码.项目的acl开发程度o ...

随机推荐

  1. JavaBean讲解 规范

    一:JavaBean定义 JavaBean是一种可重复使用.跨平台的软件组件.JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean,例如NetBean中 ...

  2. c 有关N!阶乘的相关问题----陆续补充上来

    第一个:求N!结果中末尾0的个数问题.思路是末尾0的产生   5*偶数,阶乘中偶数的个数肯定比5多,所以求出阶乘中5的个数就可以求出末尾0的个数. #include<stdio.h> in ...

  3. 【转】KVM/Installation

    [转]KVM/Installation Installation Pre-installation checklist Check that your CPU supports hardware vi ...

  4. C++基础梳理--Class、Struct、Union

    C++学习一段时间后,反过头来看我发现我忘了一下最基础的东西:strcut(结构体),union(联合体)我学会了类的一堆东西却忘了这两个最基础的: 现在就好好的重新学习一下这里的东西: 一.Clas ...

  5. NSUserDefaults概述

    原创,转载请注明原文:NSUserDefaults概述  By Lucio.Yang 首先,iOS中有四种存储数据的方式-对比iOS中的四种数据存储 NSUserDefaults是其中很常用的一种.N ...

  6. 使用BeautifulSoup解析XML文档

    有200多个XML文档,每个文档类似如下: <?xml version="1.0"?> <VehicleInfo> <FileHeader> & ...

  7. spring bean管理 笔记1

    轻量级,无侵入 Bean管理 1 创建applicationContext.xml 2 配置被管理的Bean 3 获取Bean pom.xml配置 <dependency> <gro ...

  8. HDFS写入和读取流程

    HDFS写入和读取流程 一.HDFS HDFS全称是Hadoop Distributed System.HDFS是为以流的方式存取大文件而设计的.适用于几百MB,GB以及TB,并写一次读多次的场合.而 ...

  9. Linux的五个查找命令find,locate,whereis,which,type

    Linux的五个查找命令 1. find 最常见且最强大的命令,可以查找任何文件. 格式 $ find   指定目录   指定条件   指定动作   指定目录: 所要搜索的目录及其子目录,默认当前目录 ...

  10. Swift 自定义炫酷下拉刷新效果

    先来看下效果 下拉刷新 其实下拉刷新没大家想得那么难.本文已第二个为例子.给大家讲解下下拉刷新的做法(完整代码后面会放上) 首先,先搞一个single View Application .然后进Mai ...