版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://zhangjunhd.51cto.com/113473/25593
| |||||||
本文在分析Axis2 Guide的基础上调试成功并记录了如何在Axis2中使用模块。<o:p></o:p>
author: ZJ <st1:chsdate w:st="on" year="2007" month="3" day="19" islunardate="False" isrocdate="False">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 id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><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:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype>
<o:p>
![]()
步骤一:日志模块类<o:p></o:p>
日志模块是Axis2模块的实现类。Axis2模块应该实现"org.apache.axis2.modules.Module"接口中的如下方法。
这些方法可以用来控制模块的初始化和终止。通过参数AxisConfiguration,可提供给用户完整的配置层次。模块设计者可以使用它来很好的控制模块的所有可能的操作。就这个简单的日志服务的例子而言,我们可以空实现这些类。
LoggingModule.java<o:p></o:p>
<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);"//当handlers被Axis2引擎撤销时调用。
<o:p> </o:p>
"module.xml"包含了每一个特定的模块的部署配置信息。它应该包含的细节有一个实现模块的类(本例中是"LoggingModule"和各种各样的将在不同阶段运行的handlers)。本例中配置日志模块的"module.xml"如下:
从这个文件中,我们可以看到"module.xml"定义了4个阶段:
1)inflow-表示当一个消息到来时,这个handler链将运行。
2)outflow-表示当一个消息发出时,这个handler链将运行。
3)Outfaultflow-表示当有一个错误并且这个错误将发出时,这个handler链将运行。
4)INfalutflow-表示当有一个错误并且这个错误将到来时,这个handler链将运行。
下面的标签设置描述了handler的名字,handler类和该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".)
自定义的阶段"loggingPhase"在所有的流中都放置了,因此这个状态将会被所有的消息流调用。既然我们的模块与这个状态相联系,在这个模块中的LogHandler将会在这个状态被执行。
<o:p> </o:p>
步骤五:修改"services.xml"<o:p></o:p>
到目前为止,我们已经为这个日志模块创建了所需的类和配置文件。下一步就是在我们的services中使用这个模块。我们就在MyService中使用此模块作演示。因此,我们需要修改MyService的"services.xml",以使得该模块起作用。对"services.xml"的修改如下
</service>我们在"services.xml"加入了一行"<module ref="logging"/>"。这行将告知Axis2引擎,这个日志模块可以被这个service使用。在这个模块中的handler
|