程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Axis2中使用模塊

Axis2中使用模塊

編輯:關於JAVA

1.模塊

Axis2為模塊提供一個延伸的支持。我們現在自定義一個模塊並將其部署到我 們先前創建的MyService。為一個給定的Web Service部署一個自定義的模塊,其 步驟如下:

1)建立Module Implementation。

2)創建Handlers。

3)修改"axis2.xml"。

4)修改"services.xml",使你的模塊在部署期生效。

5)將其打包為一個".mar"(Module Archive)。

6)在Axis2上部署這個模塊。

2.為MyService增加一個日志模塊

現在我們在我們的例子程序中增加一個日志模塊。這個模塊包含一個handle ,用來記錄所有傳遞給它的信息。Axis2使用". mar" (Module Archive)來部署 模塊。下圖給出了需要被打包為".mar"文檔的文件結構。

步驟一:日志模塊類

日志模塊是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;

這些方法可以用來控制模塊的初始化和終止。通過參數AxisConfiguration, 可提供給用戶完整的配置層次。模塊設計者可以使用它來很好的控制模塊的所有 可能的操作。就這個簡單的日志服務的例子而言,我們可以空實現這些類。

LoggingModule.java

package userguide.loggingmodule;
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;
public class LoggingModule implements Module {
   // initialize the module
   public void init(ConfigurationContext configContext, AxisModule module) throws AxisFault {}
   public void engageNotify(AxisDescription axisDescription) throws AxisFault {}
   // shutdown the module
   public void shutdown(ConfigurationContext configurationContext) throws AxisFault {}
   public String[] getPolicyNamespaces() {
      return null;
   }
}

步驟二:LogHandler

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引擎 撤銷時調用。

package userguide.loggingmodule;

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;
@SuppressWarnings("serial")
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;
   }
}

步驟三:module.xml

"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個階段:

1)inflow-表示當一個消息到來時,這個handler鏈將運行。

2)outflow-表示當一個消息發出時,這個handler鏈將運行。

3)Outfaultflow-表示當有一個錯誤並且這個錯誤將發出時,這個handler鏈 將運行。

4)INfalutflow-表示當有一個錯誤並且這個錯誤將到來時,這個handler鏈 將運行。

下面的標簽設置描述了handler的名字,handler類和該handler將運行的階段 。

<handler name="InFlowLogHandler" class="userguide.loggingmodule.LogHandler">
<order phase="loggingPhase" />
</handler>

步驟四:修改"axis2.xml"

在這個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 -->
<!-- ================================================= -->
<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>
       <handler name="RequestURIBasedDispatcher"
           class="org.apache.axis2.engine.RequestURIBasedDispatcher">
         <order phase="Dispatch"/>
       </handler>
       <handler name="SOAPActionBasedDispatcher"
           class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
         <order phase="Dispatch"/>
       </handler>
       <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"/>
   </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將會在這個狀態被執行。

步驟五:修改"services.xml"

到目前為止,我們已經為這個日志模塊創建了所需的類和配置文件。下一步 就是在我們的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。

步驟六:打包

在部署這個模塊之前,我們需要將這個模塊打包為一個".mar"文件。使用jar 命令可以完成,將其打包為"logging.mar"。

步驟七:在Axis2上部署這個模塊

為了在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"。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved