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文件放在
然後將.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.myServicemy=new WSC.asyn.myService();
MessageBox.Show(my.getGreeting("中國"));
MessageBox.Show("完成調用");
在執行上面的代碼後,在Tomcat控制台中輸出的信息如下圖所示。