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. Sicily-1443

    一.      题意: 模拟队列的操作,按优先级pop.如果有元素pop,则其他在队列里面的元素的时间都要加1.如果队头的元素因为优先级不够高而要push回队列的时候,所有元素的时间都不用改变. 二. ...

  2. uva311 - Packets(贪心)

    题目:311 - Packets 题目大意:给出1*1, 2*2,3 *3, 4*4, 5*5, 6*6的箱子的个数,如今有若干个6*6的箱子,问最少用多少个箱子能够将给定的箱子都装进去. 解题思路: ...

  3. 大数据时代之hadoop(五):hadoop 分布式计算框架(MapReduce)

    大数据时代之hadoop(一):hadoop安装 大数据时代之hadoop(二):hadoop脚本解析 大数据时代之hadoop(三):hadoop数据流(生命周期) 大数据时代之hadoop(四): ...

  4. 关于js的一些总结

    1.js中如果判断变量是否为空,要注意两种情况: 一种是变量为空:另一种是变量为0: 2.js如果要进行算术运算或者比较,最好把它强制类型为整型或者浮点型.防止字符串比较,如果本来是数字的字符串,如果 ...

  5. BZOJ 3304: [Shoi2005]带限制的最长公共子序列( LCS )

    求个LCS, 只是有了限制, 多加一维表示匹配到z串的第几个, 然后用滚动数组 ------------------------------------------------------------ ...

  6. php的迭代器

    接口Iterator 主要需要实现的方法: abstract public mixed current ( void ) abstract public scalar key ( void ) abs ...

  7. [LeetCode]题解(python):025-Reverse Nodes in k-Group

    题目来源: https://leetcode.com/problems/reverse-nodes-in-k-group/ 题意分析: 这道题目和上一题目类似,输入一个链表和一个整型k.每k个翻转一下 ...

  8. poj 1838

    http://poj.org/problem?id=1838 并查集,,,计算总共个数的模版..... #include <iostream> #define maxn 16006 #in ...

  9. QT无标题窗口在任务栏显示关闭(增加系统菜单)

    在对话框中使用了如下代码: setWindowFlags(Qt::FramelessWindowHint); 在任务栏上右键点击程序,不会弹出菜单,解决办法,使用下面代码: setWindowFlag ...

  10. asp.net从客户端检测到有潜在危险的Request.Form 值

    asp.net开发中,经常遇到“从客户端检测到有潜在危险的Request.Form 值”错误提示,很多人给出的解决方案是: 1.web.config文档<system.web>后面加入这一 ...