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. React Native for android 项目驱动教程

    第一节 搭建开发环境 第二节 显示页面标题 第三节 实现页面布局 # React native是什么? React Native,是颠覆性的移动开发技术.它使用js开发,又是原生应用,不同于Hybri ...

  2. WebForm发布提示:无法加载或找不到oracle.dataaccess文件

    出错提示: 在32位错做系统的开发机上引用了第三方插件(oracle的dataaccess)完成的项目,将发布的程序拷贝到64位的服务器上进行发布时提示无法加载或找不到dataaccess文件. 错误 ...

  3. git从github下载代码

    Github作为远程仓库的使用详解  http://blog.csdn.net/djl4104804/article/details/50778717 centos local:        通过g ...

  4. Arduino101 中使用 Mirf 库的问题(2016-04-04)

    Mirf 库在使用 NRF24L01 的时候接触到,感觉很好用.但在用 Arduino101 的时候遇到一些问题,记录一下,对于底层不了解,希望有熟悉的同学能给点指点: 编译会提示 MirfHardw ...

  5. 【QT相关】文件、目录基础操作

    判断目录是否存在: QString proFile(t_path); proFile.append("/dir"); QFileInfo proFileInfo(proFile); ...

  6. 杭电ACM 素数判定

    素数判定 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. hdu 4465 Candy 2012 成都现场赛

    /** 对于大数的很好的应用,,缩小放大,,保持精度 **/ #include <iostream> #include <cmath> #include <algorit ...

  8. 启动(Startup)

    Startup Chrome是一个单一的可执行程序.它清楚如何运行其它进程. 下面是chrome启动的概述: 1. 首先,chrome有一个平台相关的入口点:在windows上是wWinMain(): ...

  9. C++ ofstream和ifstream详细用法

    转载地址:http://soft.chinabyte.com/database/460/11433960.shtml ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就 ...

  10. 链接分析算法之:SALSA算法

    链接分析算法之:SALSA算法 SALSA算法的初衷希望能够结合PageRank和HITS算法两者的主要特点,既可以利用HITS算法与查询相关的特点,也可以采纳PageRank的“随机游走模型”,这是 ...