`
lk215215
  • 浏览: 64316 次
  • 来自: ...
社区版块
存档分类
最新评论

二、Axis2中使用模块

阅读更多
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhangjunhd.blog.51cto.com/113473/25593
本文在分析Axis2 Guide的基础上调试成功并记录了如何在Axis2中使用模块。<o:p></o:p>
author: ZJ <st1:chsdate year="2007" month="3" day="19" islunardate="False" isrocdate="False" w:st="on">07-3-19</st1:chsdate>
<o:p> </o:p>
1.模块<o:p></o:p>
Axis2为模块提供一个延伸的支持。我们现在自定义一个模块并将其部署到我们先前创建的MyService。为一个给定的Web Service部署一个自定义的模块,其步骤如下:
1建立Module Implementation<o:p></o:p>
2)创建Handlers<o:p></o:p>
3)修改"axis2.xml"<o:p></o:p>
4)修改"services.xml",使你的模块在部署期生效。<o:p></o:p>
5)将其打包为一个".mar"(Module Archive)<o:p></o:p>
6)在Axis2上部署这个模块。<o:p></o:p>
<o:p> </o:p>
2.为MyService增加一个日志模块<o:p></o:p>
现在我们在我们的例子程序中增加一个日志模块。这个模块包含一个handle,用来记录所有传递给它的信息。Axis2使用". mar" (Module Archive)来部署模块。下图给出了需要被打包为".mar"文档的文件结构。
<v:shapetype coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" id="_x0000_t75"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype>
<o:p> </o:p>
步骤一:日志模块类<o:p></o:p>
日志模块是Axis2模块的实现类。Axis2模块应该实现"org.apache.axis2.modules.Module"接口中的如下方法。
public void init(ConfigurationContext configContext, AxisModule module)
 throws AxisFault;//Initialize the module
public void shutdown(AxisConfiguration axisSystem)
 throws AxisFault;//End of module processing
public void engageNotify(AxisDescription axisDescription) throws AxisFault;
LoggingModule.java<o:p></o:p>
package userguide.loggingmodule;
<o:p> </o:p>
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.AxisDescription;<o:p></o:p>
import org.apache.axis2.description.AxisModule;<o:p></o:p>
import org.apache.axis2.modules.Module;<o:p></o:p>
<o:p> </o:p>
public class LoggingModule implements Module {<o:p></o:p>
    // initialize the module<o:p></o:p>
    public void init(ConfigurationContext configContext, AxisModule module) throws AxisFault {}<o:p></o:p>
    public void engageNotify(AxisDescription axisDescription) throws AxisFault {}
    // shutdown the module
    public void shutdown(ConfigurationContext configurationContext) throws AxisFault {}
    public String[] getPolicyNamespaces() {
           return null;     
    }
}
<o:p> </o:p>
步骤二:LogHandler<o:p></o:p>
Axis2中的模块可以包含一个或多个handlers用来在不同的阶段执行不同的SOAP头处理。创建一个handler,应该实现org.apache.axis2.engine.Handler。但是为简单起见,org.apache.axis2.handlers.AbstractHandler提供了一个对Handler接口的抽象的实现。针对本例日志模块,我们将创建一个handler包含以下方法:
1"public void invoke(MessageContext ctx);"//当控制权转到handler时,由Axis2引擎调用。
2"public void revoke(MessageContext ctx);"//handlersAxis2引擎撤销时调用。
package userguide.loggingmodule;
<o:p> </o:p>
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;
import javax.xml.namespace.QName;<o:p></o:p>
@SuppressWarnings("serial")<o:p></o:p>
public class LogHandler extends AbstractHandler implements Handler {
       private static final Log log = LogFactory.getLog(LogHandler.class);
    private QName name;
    public QName getName() {
        return name;
    }
    public void invoke(MessageContext msgContext) throws AxisFault {
        log.info(msgContext.getEnvelope().toString());
    }
    public void revoke(MessageContext msgContext) {
        log.info(msgContext.getEnvelope().toString());
    }
    public void setName(QName name) {
        this.name = name;
    }
}
<o:p> </o:p>
"module.xml"包含了每一个特定的模块的部署配置信息。它应该包含的细节有一个实现模块的类(本例中是"LoggingModule"和各种各样的将在不同阶段运行的handlers)。本例中配置日志模块的"module.xml"如下:
<module name="logging" class="userguide.loggingmodule.LoggingModule ">
   <inflow>
        <handler name="InFlowLogHandler" class="userguide.loggingmodule.LogHandler">
        <order phase="loggingPhase" />
        </handler>
   </inflow>
   <outflow>
        <handler name="OutFlowLogHandler" class="userguide.loggingmodule.LogHandler">
        <order phase="loggingPhase"/>
        </handler>
   </outflow>
   <Outfaultflow>
        <handler name="FaultOutFlowLogHandler"
                  class="userguide.loggingmodule.LogHandler">
        <order phase="loggingPhase"/>
        </handler>
   </Outfaultflow>
   <INfaultflow>
        <handler name="FaultInFlowLogHandler"
class="userguide.loggingmodule.LogHandler">
        <order phase="loggingPhase"/>
        </handler>
   </INfaultflow>
</module>
从这个文件中,我们可以看到"module.xml"定义了4个阶段:
1inflow-表示当一个消息到来时,这个handler链将运行。
2outflow-表示当一个消息发出时,这个handler链将运行。
3Outfaultflow-表示当有一个错误并且这个错误将发出时,这个handler链将运行。
4INfalutflow-表示当有一个错误并且这个错误将到来时,这个handler链将运行。
下面的标签设置描述了handler的名字,handler类和该handler将运行的阶段。
<handler name="InFlowLogHandler" class="userguide.loggingmodule.LogHandler">
<order phase="loggingPhase" />
</handler>
<o:p> </o:p>
步骤四:修改"axis2.xml"<o:p></o:p>
在这个handler中,阶段"loggingPhase"是由这个模块的设计者定义的。这不是一个预定义的handler阶段,因此该模块的设计者应该将它在"axis2.xml"中声明。只有这样,Axis2引擎才能知道将这个handler放置在哪些“流”中(InFlow, OutFlow,等)。下面的xml定义展示了需要将日志模块部署到Axis2引擎而对axis2.xml作的修改。(This is an extract of the phase section of the "axis2.xml".
<!-- ================================================= -->
<!-- Phases -->
<!-- ================================================= -->
<o:p> </o:p>
<phaseOrder type="inflow">
        <!--  System pre defined phases       -->
        <phase name="TransportIn"/>
        <phase name="PreDispatch"/>
        <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
            <handler name="AddressingBasedDispatcher"
                     class="org.apache.axis2.engine.AddressingBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>
<o:p> </o:p>
            <handler name="RequestURIBasedDispatcher"
                     class="org.apache.axis2.engine.RequestURIBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>
<o:p> </o:p>
            <handler name="SOAPActionBasedDispatcher"
                     class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>
<o:p> </o:p>
            <handler name="SOAPMessageBodyBasedDispatcher"
                     class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>
            <handler name="InstanceDispatcher"
                     class="org.apache.axis2.engine.InstanceDispatcher">
                <order phase="PostDispatch"/>
            </handler>
        </phase>
        <!--  System pre defined phases       -->
        <!--   After Postdispatch phase module author or or service author can add any phase he want      -->
        <phase name="OperationInPhase"/>
        <phase name="loggingPhase"/><o:p></o:p>
    </phaseOrder>
    <phaseOrder type="outflow">
        <!--      user can add his own phases to this area  -->
        <phase name="OperationOutPhase"/>
        <phase name="loggingPhase"/>
        <!--system predefined phase-->
        <!--these phase will run irrespective of the service-->
        <phase name="PolicyDetermination"/>
        <phase name="MessageOut"/>
    </phaseOrder/>
    <phaseOrder type="INfaultflow">
        <!--      user can add his own phases to this area  -->
        <phase name="OperationInFaultPhase"/>
        <phase name="loggingPhase"/>
    </phaseOrder>
    <phaseOrder type="Outfaultflow">
        <!--      user can add his own phases to this area  -->
        <phase name="OperationOutFaultPhase"/>
        <phase name="loggingPhase"/>
        <phase name="PolicyDetermination"/>
        <phase name="MessageOut"/>
    </phaseOrder>
自定义的阶段"loggingPhase"在所有的流中都放置了,因此这个状态将会被所有的消息流调用。既然我们的模块与这个状态相联系,在这个模块中的LogHandler将会在这个状态被执行。
<o:p> </o:p>
步骤五:修改"services.xml"<o:p></o:p>
到目前为止,我们已经为这个日志模块创建了所需的类和配置文件。下一步就是在我们的services中使用这个模块。我们就在MyService中使用此模块作演示。因此,我们需要修改MyService"services.xml",以使得该模块起作用。对"services.xml"的修改如下
<service name="MyServiceWithModule">
<description>
This is a sample Web Service with a logging module engaged.
</description>
<module ref="logging"/>
<parameter name="ServiceClass" locked="false">
userguide.example1.MyService
</parameter>
<operation name="echo">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
<operation name="ping">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
</service>我们在"services.xml"加入了一行"<module ref="logging"/>"。这行将告知Axis2引擎,这个日志模块可以被这个service使用。在这个模块中的handler将在各自的状态被执行(依据"module.xml"中的描述)。并将服务重新打包为MyServiceWithModule.aar<o:p></o:p>
<o:p> </o:p>
步骤六:打包<o:p></o:p>
在部署这个模块之前,我们需要将这个模块打包为一个".mar"文件。使用jar命令可以完成,将其打包为"logging.mar"
<o:p> </o:p>
步骤七:在Axis2上部署这个模块<o:p></o:p>
为了在Axis2上部署模块,用户必须自己新建一个目录,取名为"modules",它的父目录为servlet容器中的"webapps/axis2/WEB-INF",再将".mar"文件复制到此目录下。本例中,为"logging.mar"
注:为了看到日志,用户必须将"log4j.properties"设置为log INFO。该配置文件在servlet容器下的"webapps\axis2\WEB-INF\classes"目录。将"log4j.rootCategory= ERROR, LOGFILE"替换为"log4j.rootCategory=INFO, ERROR, LOGFILE"<o:p> </o:p>

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/25593

分享到:
评论
1 楼 wangacidlemon 2009-06-19  
乱就一个字,我只说一次

相关推荐

    axis2-1.5.1-bin.zip axis2-1.5.1-war.zip axis2部署使用

    1. 对于`axis2-1.5.1-bin.zip`,你需要解压文件,然后在命令行中使用提供的脚本启动Axis2服务。 2. 创建Web服务,可以使用Java代码或者WSDL(Web Service Description Language)文件。 3. 将Web服务打包为AAR(Axis...

    axis2中文教程搜集

    9. **错误处理与调试**:学习如何处理Axis2中的错误和异常,以及如何进行日志记录和调试,对于解决实际问题至关重要。 10. **性能优化**:了解Axis2的缓存机制、多线程处理和线程池配置,可以帮助优化服务性能,...

    web service 使用 axis2 框架使用的插件

    2. **Axis2插件**:在Axis2中,插件用于扩展其功能,提供额外的服务处理、安全性和性能优化。以下是一些常用的Axis2插件: - **-axis2-codegen-plugin**:代码生成插件,能够根据WSDL文件自动生成客户端和服务端的...

    Axis2中文手册

    3. **AXIOM**:AXIOM(Abstraction eXtensible Information Model)是Axis2中的轻量级对象模型,简化了消息处理并提供了高性能。 4. **热部署**:服务可以在系统运行时动态部署,无需重启服务器,只需将服务部署包放...

    axis2-1.6.1

    描述中提到的“axis2-1.6.1”进一步确认了这是Apache Axis2的一个特定发行版,它可能包含了修复的bug、性能优化和其他功能增强。 标签“axis2-1.6.1”是用来标识和分类这个软件包的,便于搜索和理解其用途。 压缩...

    axis2的API,axis2 API,axis2帮助文档

    本文将详细介绍Axis2的API及其在Web服务开发中的应用,同时也会探讨Axis2的帮助文档如何协助开发者更好地理解和使用这个框架。 ### Axis2简介 Axis2是Apache Axis的第二代版本,它在第一代的基础上进行了许多改进和...

    Axis_API和axis2_API

    Axis2采用了模块化架构,允许开发者根据需要选择和加载特定功能模块,这极大地提高了性能和可扩展性。此外,Axis2支持多种传输协议(如HTTP、JMS和SMTP),并提供了更高级别的消息处理机制。 在使用Axis和Axis2时,...

    axis2用户身份认证扩展模块

    "Axis2用户身份认证扩展模块"是一个专门为基于Axis2的Web服务提供安全增强的身份验证解决方案。Axis2是Apache软件基金会开发的一个开源Web服务引擎,它允许开发者创建和部署SOAP(简单对象访问协议)和RESTful(表述...

    axis2最新使用包

    在本文中,我们将深入探讨Axis2的核心特性、Web服务的工作原理以及如何使用Axis2来创建和消费Web服务。 首先,让我们理解一下什么是Web服务。Web服务是一种通过网络进行通信的应用程序接口(API),它使用开放标准...

    axis 1.x与axis2.x开发

    在开发过程中, Axis1.x和Axis2.x的使用方式也有所不同。Axis1.x通常通过创建一个Java类并使用注解或配置文件来定义Web服务接口和实现。然后,使用 Axis工具将这个类转换为Web服务。而在Axis2.x中,服务接口和实现...

    eclipse java axis2

    在Java环境中,Eclipse作为流行的集成开发环境(IDE),提供了强大的支持来帮助开发者使用Axis2创建、测试和管理Web服务。 在了解Eclipse Java Axis2之前,我们需要先理解Web服务的基本概念。Web服务是一种通过HTTP...

    Axis2 接口生成wsdl工具

    在Axis2中,可以通过编写Java接口并使用Apt(Annotation Processing Tool)或者Wsdl2Java工具来生成WSDL文件。WSDL文件是一个XML文档,详细描述了Web服务的接口、消息格式、操作和地址,使得客户端能够理解如何与...

    axis2学习资料

    5. **异常处理和安全性**:了解如何在Axis2中处理错误和异常,以及如何实现Web服务的安全性,例如通过WS-Security标准。 6. **WS-*规范支持**:熟悉Axis2对各种Web服务标准的支持,如WS-Addressing、WS-...

    axis2包 使用axis2开发webservice需要的jar包

    在Java世界中,开发Web服务(Web Service)是一种常见的接口通信方式,Axis2是Apache软件基金会提供的一个开源工具,专门用于构建和部署Web服务。它基于SOAP(简单对象访问协议)标准,支持WS-*规范,提供了高效且...

    axis2 包括源码 文档

    Axis2是Apache软件基金会开发的一个开源Web服务框架,主要用于构建高度可...无论是新手还是经验丰富的开发者,都可以从 Axis2 的文档中获取所需信息,通过源码了解其实现细节,并利用二进制包快速构建和部署Web服务。

    Axis2的使用实例

    【Axis2的使用实例】 Apache Axis2 是一个强大的Web服务引擎,它是在Axis1.x基础上进行重新设计的,提供了一种更加高效且灵活的方式来开发和部署Web服务。本实例将介绍如何利用Axis2创建无需配置文件的Web服务,并...

    s2axis2 实例

    5. **数据交换格式**:在Seasar2 Axis2中,可以自由选择数据交换格式,如XML、JSON等。对于需要高性能传输的场景,还可以利用Axis2的MTOM特性,有效处理二进制数据。 6. **安全性**:Seasar2和Axis2都提供了安全...

    axis1.4和axis2相关jar文件

    1. **模块化架构**:Axis2引入了模块化的设计,使得服务和功能可以独立加载和卸载,增强了系统的灵活性。 2. **效率提升**:通过使用基于XML流处理的Axiom库,Axis2提高了处理大量XML数据时的性能。 3. **多协议支持...

    axis2-1.6.2.zip

    - **文档**:可能有用户指南、API文档等,帮助开发者理解和使用Axis2。 - **配置文件**:如axis2.xml,这是Axis2的主配置文件,用于定义服务行为和服务部署的细节。 - **工具**:可能包括上面提到的wsdl2java和java2...

    axis2-1.5.6完整版

    在实际开发中,开发人员通常会先解压 `axis2-1.5.6-bin.zip`,配置 Axis2 环境,然后使用 `axis2-1.5.6-war.zip` 在服务器上部署 Web 服务。如果需要更深入地理解 Axis2 的工作原理或者开发自定义模块,`axis2-1.5.6...

Global site tag (gtag.js) - Google Analytics