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. C++模板:欧拉函数

    单个欧拉函数 int eular(int n){ int ret=1,i; for(i=2;i*i<=n;i++) if(n%i==0){ n/=i,ret*=i-1; while(n%i==0 ...

  2. iostream.h 和stdio.h区别

    stdio.h是C的标准I/O库,是以函数的方式向buffer写入或读取字符.输入输出是这样的printf(...);,scanf(...); iostream是C++的标准I/O库,引入了输入/输出 ...

  3. Bug驱动开发(Bug-driven development)

    说实话,作为一个Domino开发者,像測试驱动开发(Test-driven development).功能驱动开发(Feature-driven development)之类软件开发的高大上的方法论( ...

  4. Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据

    XQuery 是一个浏览/返回XML实例的标准语言. 它比老的只能简单处理节点的XPath表达式更丰富. 你可以同XPath一样使用.或是遍历所有节点,塑造XML实例的返回等. 作为一个查询语言, 你 ...

  5. Windows最常用的几个网络CMD命令总结

    Windows最常用的几个网络CMD命令总结 http://www.cnblogs.com/sbaicl/archive/2013/03/05/2944001.html 一.ping 主要是测试本机T ...

  6. BZOJ 2196: [Usaco2011 Mar]Brownie Slicing( 二分答案 )

    二分答案就可以了.... ----------------------------------------------------------------------- #include<cst ...

  7. php定时自动执行 需启动第一次

    1 2 3 4 5 6 7 8 9 10 11 12 <? ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. set_time_li ...

  8. HYSBZ 2301

    /*** 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数 **/ #include <iost ...

  9. QT动画介绍(有例子可以下载)

    所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义好这样状态,实现动画就是水到渠成的事情.当然做这件事情,最好用的就是状态机,点击这里查看Qt使用状态机实现动画效果实例. 不过,实现动画也有 ...

  10. 最长回文串(manacher算法)

    ; ; int p[N]; char str[LEN], tmp[N]; //p[i]表示以str[i]为中心的回文往右延伸的 最长长度 void manacher(char* str, int* p ...