CONAN ZONE

          你越掙扎我就越興奮

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            0 Posts :: 282 Stories :: 0 Comments :: 0 Trackbacks
          Axis2可以通過模塊(Module)進行擴展。Axis2模塊至少需要有兩個類,這兩個類分別實現了ModuleHandler接口。開發和使用一個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.marservice.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#代碼調用MyServicegetGreeting方法則會在Tomcat控制臺中輸出相應的請求和響應SOAP消息。

          //  async是引用MyService的服務名
          async.myService my = new WSC.asyn.myService();
          MessageBox.Show(my.getGreeting(
          "中國"));
          MessageBox.Show(
          "完成調用");

           

              在執行上面的代碼后,在Tomcat控制臺中輸出的信息如下圖所示。


          轉自:http://www.aygfsteel.com/nokiaguy/archive/2009/02/16/254826.html



          posted on 2009-02-16 16:47 CONAN 閱讀(290) 評論(0)  編輯  收藏 所屬分類: Web Service
          主站蜘蛛池模板: 绥德县| 安龙县| 儋州市| 托克逊县| 高州市| 西盟| 吴川市| 辽宁省| 连州市| 洛川县| 东乡族自治县| 孟州市| 布拖县| 宾川县| 阿拉善左旗| 溆浦县| 新蔡县| 义乌市| 北安市| 镇原县| 习水县| 海口市| 永吉县| 张掖市| 长沙市| 乾安县| 蒲江县| 长海县| 那坡县| 苏尼特左旗| 长治市| 当阳市| 特克斯县| 山东省| 额敏县| 遂昌县| 齐河县| 四川省| 大方县| 綦江县| 景谷|