posts - 495,comments - 227,trackbacks - 0

          通過(guò) Axis2 開(kāi)發(fā) Web 服務(wù),第 1 部分: 通過(guò) Axis2 運(yùn)行時(shí)部署和使用簡(jiǎn)單 Web 服務(wù)

          developerWorks
          文檔選項(xiàng)
          將此頁(yè)作為電子郵件發(fā)送

          將此頁(yè)作為電子郵件發(fā)送

          樣例代碼


          拓展 Tomcat 應(yīng)用

          下載 IBM 開(kāi)源 J2EE 應(yīng)用服務(wù)器 WAS CE 新版本 V1.1


          級(jí)別: 中級(jí)

          Gopalakrishnan U (ugopalak@in.ibm.com), 軟件工程師, IBM India Software Labs
          Shreevidya Rao (ugopalak@in.ibm.com), 軟件工程師, IBM

          2006 年 6 月 13 日

          本文介紹 Axis2 的新體系結(jié)構(gòu),并說(shuō)明如何通過(guò) Axis2 部署和使用 Web 服務(wù)。本文是有關(guān)通過(guò) Axis2 運(yùn)行時(shí)開(kāi)發(fā) Web 服務(wù)的系列文章的第 1 部分(共兩部分)。Axis2 是下一代 Apache Axis Simple Object Access Protocol (SOAP) 運(yùn)行時(shí)。

          引言

          Axis2 是下一代 Apache Axis。Axis2 雖然由 Axis 1.x 處理程序模型提供支持,但它具有更強(qiáng)的靈活性并可擴(kuò)展到新的體系結(jié)構(gòu)。Axis2 基于新的體系結(jié)構(gòu)進(jìn)行了全新編寫(xiě),而且沒(méi)有采用 Axis 1.x 的常用代碼。支持開(kāi)發(fā) Axis2 的動(dòng)力是探尋模塊化更強(qiáng)、靈活性更高和更有效的體系結(jié)構(gòu),這種體系結(jié)構(gòu)可以很容易地插入到其他相關(guān) Web 服務(wù)標(biāo)準(zhǔn)和協(xié)議(如 WS-Security、WS-ReliableMessaging 等)的實(shí)現(xiàn)中。

          Axis2 的特性包括:

          • 采用名為 AXIOM(AXIs Object Model,Axis 對(duì)象模型)的新核心 XML 處理模型
          • 支持 In-Only 和 In-Out 消息交換模式 (MEP)
          • 阻塞和非阻塞客戶(hù)端 API(應(yīng)用程序編程接口)
          • 支持內(nèi)置的 Web 服務(wù)尋址 (WS-Addressing)
          • 支持 XMLBeans 數(shù)據(jù)綁定
          • 新部署模型
          • 支持超文本傳輸協(xié)議 (HTTP)、簡(jiǎn)單郵件傳輸協(xié)議 (SMTP) 和傳輸控制協(xié)議 (TCP) 等傳輸協(xié)議

          本系列文章以 Axis2 0.92 版本為基礎(chǔ)。您可以在 Apache 網(wǎng)站獲得 Axis2 的最新版本。





          回頁(yè)首


          Axis 體系結(jié)構(gòu)概述


          圖 1. Axis2 體系結(jié)構(gòu)
          Axis2 體系結(jié)構(gòu)

          Axis2 體系結(jié)構(gòu)將邏輯與狀態(tài)分離;這允許在并行線(xiàn)程中執(zhí)行邏輯。服務(wù)和調(diào)用的靜態(tài)狀態(tài)和動(dòng)態(tài)狀態(tài)分別存儲(chǔ)在 DescriptionContext 類(lèi)中。Axis2 體系結(jié)構(gòu)是使用 7 個(gè)獨(dú)立模塊實(shí)現(xiàn)的。

          1. 信息模型:此模塊管理 SOAP 引擎的狀態(tài)。該模型定義一組用于存放狀態(tài)的類(lèi),而引擎管理這些信息對(duì)象的生命周期。信息模型包含兩種用于存放狀態(tài)的類(lèi)。Description 類(lèi)存放本質(zhì)上是靜態(tài)的且存在于 Axis 引擎實(shí)例的整個(gè)生命周期中的數(shù)據(jù)(如傳輸、服務(wù)和操作的配置)。Context 類(lèi)存放調(diào)用上下文中有效的服務(wù)和操作的動(dòng)態(tài)信息,例如當(dāng)前請(qǐng)求和響應(yīng) SOAP 消息、From 地址、To 地址和其他元素。
          2. XML 處理模型:Axis2 引入了一個(gè)名為 AXIOM 的新模型,用于處理 SOAP 消息。AXIOM 使用 StAX (Streaming API for XML) 來(lái)解析 XML。StAX 是一個(gè)標(biāo)準(zhǔn)的流式 Pull 解析器 Java? API。AXIOM 非常精巧,不會(huì)減慢 XML 信息集的構(gòu)建速度——換句話(huà)說(shuō),對(duì)象只有在絕對(duì)必要時(shí)才會(huì)創(chuàng)建。總體而言,AXIOM 和 Axis2 所占用的內(nèi)存要小于 Axis 1 所占用的內(nèi)存。
          3. SOAP 處理模型:Axis2 體系結(jié)構(gòu)定義了兩個(gè)管道(或流),分別稱(chēng)為 InPipe (InFlow) 和 OutPipe (OutFlow),用于處理服務(wù)器端的請(qǐng)求消息和響應(yīng)消息。在客戶(hù)端,這兩個(gè)管道是反向的——換句話(huà)說(shuō),SOAP 請(qǐng)求消息流經(jīng) OutPipe,而響應(yīng)消息流經(jīng) InPipe。管道或流包含一系列分為階段的處理程序。階段按照預(yù)先定義的順序執(zhí)行,如上面的圖 1 所示。除預(yù)先定義的階段和處理程序集外,用戶(hù)還可以在操作級(jí)別、服務(wù)級(jí)別或全局級(jí)別配置用戶(hù)階段和相關(guān)處理程序。處理程序充當(dāng) SOAP 消息的攔截器,可以處理 SOAP 消息的 Header 或 Body。InPipe 是通過(guò)以下階段進(jìn)行配置的:
            • TransportIn
            • PreDispatch
            • Dispatch
            • PostDispatch
            • PolicyDetermination
            • User phases
            • Message validation
            我們將在本系列文章的第 2 部分中詳細(xì)介紹上述各階段。請(qǐng)求消息在通過(guò) Inpipe 中配置的所有階段后,到達(dá) MessageReceiver,然后由 MessageReceiver 調(diào)用實(shí)際服務(wù)實(shí)現(xiàn)。服務(wù)器的 OutPipe 包含以下階段:
            • Message initialization
            • Policy determination
            • User phases
            • MessageOut
            用戶(hù)配置的階段位于這兩個(gè)管道的用戶(hù)階段(User phases) 部分。如果在執(zhí)行這些管道的過(guò)程中發(fā)生錯(cuò)誤,則這些錯(cuò)誤將通過(guò) InFaultPipe 或 OutFaultPipe 管道。收到 Fault 消息后,在客戶(hù)端調(diào)用 InFaultPipe;如果某個(gè)調(diào)用導(dǎo)致將錯(cuò)誤發(fā)送到客戶(hù)端,則在服務(wù)器端調(diào)用 OutFaultPipe。用戶(hù)可以將處理程序添加到預(yù)先定義的階段,并且按照這些處理程序運(yùn)行的順序進(jìn)行配置。
          4. 部署模塊:此模塊配置 Axis 引擎并部署服務(wù)和模塊。axis2.xml(在 webapps/axis2/WEB-INF 中)包含 Axis2 引擎的全局配置,包括:
            • 全局模塊 (Global modules)
            • 全局接收器 (Global receivers)
            • 傳輸 (Transports)
            • 用戶(hù)階段定義 (User phase definitions)
            每個(gè)服務(wù)的配置都包含在服務(wù)存檔的 services.xml 文件中。本文稍后將詳細(xì)討論此文件。
          5. WSDL 和代碼生成:此模塊從 WSDL 文件中生成客戶(hù)端存根和服務(wù)器框架代碼。Axis2 代碼生成器發(fā)出采用正確 XML 樣式表的 XML 文件,以用所需語(yǔ)言生成代碼。
          6. 客戶(hù)端 API:Axis2 客戶(hù)端 API 調(diào)用遵循 WSDL 2.0 定義的 In-Only 和 In-Out 消息模式的操作。客戶(hù)端 API 支持 In-Out 操作的阻塞和非阻塞調(diào)用。
          7. 傳輸:此模塊包含與傳輸層交互的處理程序。傳輸處理程序有兩種類(lèi)型:TransportListener 和 TransportSender。TransportListener 從傳輸層接收 SOAP 消息,然后將其傳送到 InPipe 進(jìn)行處理。TransportSender 發(fā)送通過(guò)指定傳輸從 OutPipe 接收到的 SOAP 消息。Axis2 提供 HTTP、SMTP 和 TCP 的處理程序。對(duì)于 HTTP 傳輸,服務(wù)器端上的 AxisServlet 和客戶(hù)端上的一個(gè)簡(jiǎn)單的獨(dú)立 HTTP 服務(wù)器(由 Axis2 提供)充當(dāng) TransportReceiver。




          回頁(yè)首


          部署 Axis2

          部署 Axis2 與部署 Axis 1 一樣簡(jiǎn)單。首先在 Axis2 二進(jìn)制代碼分發(fā)包的 webapps 目錄下查找 Axis2 Web 應(yīng)用程序 axis2.war。在 servlet 容器中部署此 war 文件。在 Tomcat 中,如果已在服務(wù)器配置中將 unpackWARs 設(shè)置為 True,則只需將 axis2.war 復(fù)制到 $TOMCAT_HOME/webapps 目錄即可部署 Axis2。請(qǐng)立即啟動(dòng) Tomcat 并訪(fǎng)問(wèn) http://localhost:<port>/axis2。將顯示 Axis2 歡迎頁(yè),單擊此頁(yè)上的 Validate 鏈接。您應(yīng)到達(dá) Axis2 Happiness page,不會(huì)出現(xiàn)任何錯(cuò)誤。





          回頁(yè)首


          開(kāi)發(fā) StockQuoteService

          下面介紹如何使用 In-Only subscribe() 和 In-Out getQuote() 這兩個(gè)操作來(lái)開(kāi)發(fā) StockQuoteService。subscribe() 操作將預(yù)訂指定代號(hào)的每小時(shí)報(bào)價(jià),而 getQuote() 將獲得指定代號(hào)的當(dāng)前報(bào)價(jià)。

          下面的清單 1 是 StockQuoteService 的實(shí)現(xiàn)示例:


          清單 1. StockQuoteService 實(shí)現(xiàn)
          				
          package stock;
          import org.apache.axis2.om.OMAbstractFactory;
          import org.apache.axis2.om.OMElement;
          import org.apache.axis2.om.OMFactory;
          import org.apache.axis2.om.OMNamespace;
          		
          public class StockQuoteService {
          		 
            public void subscribe(OMElement in){
              String symbol = in.getText();
              System.out.println("Subscription request for symbol ="+symbol);
              // put the actual subscribe code here...    
            }
          		  
          		  
            public OMElement getQuote(OMElement in){
          		  
              // Get the symbol from request message
              String symbol = in.getText();
          		    
              int quote = 0;
              if(symbol.equals("IBM")){
                quote = 100;
              }
              // Put more quotes here ...
          		    
              // Create response
              OMFactory fac = OMAbstractFactory.getOMFactory();
              OMNamespace omNs = fac.createOMNamespace(
                "http://www.developerworks.com/example", "example");
              OMElement resp = fac.createOMElement("getQuoteResponse", omNs);
              resp.setText(String.valueOf(quote));
              return resp;      
            }
          }
          

          對(duì)方法簽名感到很疑惑?我們將討論上述方法中的 OMElement





          回頁(yè)首


          部署服務(wù)

          部署描述符

          在 Axis2 中,服務(wù)部署信息包含在 services.xml 文件(在 0.92 以前的版本中,此文件名為 service.xml)中。對(duì)于上述 StockQuoteService,服務(wù)部署描述符與下面的清單 2 類(lèi)似。


          清單 2. Services.xml
          				
          <service name="StockQuoteService">
            <parameter name="ServiceClass" locked="xsd:false">
              stock.StockQuoteService
            </parameter>
          		
            <operation name="getQuote">
              <messageReceiver 
                class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
            </operation>
          		
            <operation name="subscribe">
              <messageReceiver 
                class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
            </operation>
          </service>
          

          服務(wù)的 name 屬性定義服務(wù)的名稱(chēng)。Axis2 使用服務(wù)的名稱(chēng)創(chuàng)建服務(wù)的端點(diǎn)地址,例如 http://localhost:<port>/axis2/services/<nameofservice>。因此,對(duì)于 StockQuoteService,服務(wù)端點(diǎn)為 http://localhost:<port>/axis2/services/StockQuoteServiceServiceClass 參數(shù)指定服務(wù)實(shí)現(xiàn)類(lèi)。

          每個(gè) <operation> 元素定義服務(wù)中一個(gè)操作的配置。<operation> 的 name 屬性應(yīng)設(shè)置為服務(wù)實(shí)現(xiàn)類(lèi)中方法的名稱(chēng)。messageReceiver 元素定義用于處理此操作的消息接收器。Axis2 針對(duì) In-Only 和 In-Out 操作提供了兩個(gè)無(wú)數(shù)據(jù)綁定的內(nèi)置 MessageReceivers;org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver 用于 In-Only 操作,而 org.apache.axis2.receivers.RawXMLINOutMessageReceiver 用于 In-Out 操作。如果沒(méi)有指定 messageReceiver,則 Axis2 將嘗試使用 org.apache.axis2.receivers.RawXMLINOutMessageReceiver 作為缺省的 messageReceiver。上述 RAWXML 消息接收器將傳入 SOAP 消息的 <Body> 的內(nèi)容作為 OMElement(OMElement 是 XML 元素的 AXIOM 縮寫(xiě))傳遞給服務(wù)實(shí)現(xiàn)。此操作應(yīng)作為 OMElement 返回 SOAP 響應(yīng)的 <Body> 元素包含的 XML 內(nèi)容。這便解釋了為何 subscribe() 和 getQuote() 操作采用和返回 OMElement。

          services.xml 還可以包含分為 servicegroup 的多個(gè)服務(wù)。

          打包

          Axis 2 服務(wù)是作為 Axis Archive (.aar) 打包的。這是一個(gè) JAR 文件(使用 jar 或 zip 實(shí)用程序創(chuàng)建),在存檔的 META-INF 目錄中打包了 services.xml 文件。StockQuoteService 在打包成 StockQuoteService.aar 時(shí)將具有以下結(jié)構(gòu):

          ./stock/StockQuoteService.class
          ./META-INF/services.xml

          預(yù)先打包的 StockQuoteService 存檔可以在本文的下載部分中找到。

          部署

          在 Axis2 中部署服務(wù)相當(dāng)簡(jiǎn)單,只需將 .aar 文件復(fù)制到 servlet 容器的 axis2 Web 應(yīng)用程序中的 axis2/WEB-INF/services 目錄下即可。對(duì)于 Tomcat,此位置為 $TOMCAT_HOME/webapps/axis2/WEB-INF/services

          另一種部署服務(wù)的好方法是使用 Axis2 管理控制臺(tái)中的 Upload Service 工具。請(qǐng)轉(zhuǎn)到 http://localhost:<port>/axis2,然后選擇 Administration 鏈接。輸入用戶(hù)名和密碼 admin/axis2,然后登錄。(您可以在 axis2.xml 中配置用戶(hù)名/密碼。)在工具部分選擇 Upload Service 鏈接,再選擇 .aar 文件,然后單擊 Upload。就是這樣簡(jiǎn)單!如果上傳成功,系統(tǒng)將顯示一條綠色成功消息。服務(wù)即被部署,而且可隨時(shí)調(diào)用。如果要在遠(yuǎn)程 Axis2 服務(wù)器上部署服務(wù),則此功能非常方便。





          回頁(yè)首


          通過(guò) Axis2 使用 Web 服務(wù)

          Web 服務(wù)調(diào)用的特性由 MEP、傳輸協(xié)議以及客戶(hù)端 API 的同步和/或異步行為決定。Axis2 當(dāng)前支持 WSDL 2.0 定義的 In-Only 和 In-Out MEP。Axis2 客戶(hù)端 API 支持服務(wù)的同步和異步調(diào)用。在調(diào)用 In-Out 操作時(shí),在 API 級(jí)別和傳輸級(jí)別提供異步行為。API 級(jí)別異步是通過(guò)回滾獲得的,它使用一個(gè)傳輸連接來(lái)同時(shí)傳輸請(qǐng)求和響應(yīng)(例如,通過(guò)一個(gè) HTTP 連接傳輸請(qǐng)求和響應(yīng))。在傳輸級(jí)別異步中,使用不同的傳輸連接分別發(fā)送請(qǐng)求和接收響應(yīng),例如使用 SMTP 進(jìn)行傳輸時(shí)即如此。

          下面是使用 Axis2 客戶(hù)端 API 調(diào)用 In-Only 和 In-Out 操作的詳細(xì)信息。

          調(diào)用 In-Only 操作

          org.apache.axis2.clientapi.MessageSender 類(lèi)用于調(diào)用 In-Only 操作(如下面的清單 3 所示),而 In-Only 操作調(diào)用 StockQuoteServicesubscribe() 操作。


          清單 3. 調(diào)用 In-Only 操作
          				
          try{
            EndpointReference targetEPR = new EndpointReference(
                "http://localhost:8080/axis2/services/StockQuoteService");
                    
            // Make the request message
            OMFactory fac = OMAbstractFactory.getOMFactory();
            OMNamespace omNs = fac.createOMNamespace(
                "http://www.developerworks.com/example", "example");
            OMElement payload = fac.createOMElement("subscribe", omNs);
            payload.setText("IBM"); 
                    
            // Send the request
            MessageSender msgSender = new MessageSender();
            msgSender.setTo(targetEPR);
            msgSender.setSenderTransport(Constants.TRANSPORT_HTTP);
            msgSender.send("subscribe", payload);         
            }catch (AxisFault axisFault) {
                axisFault.printStackTrace();
            }
          

          MessageSender.send() 發(fā)送請(qǐng)求消息并將其立即返回。要使用的傳輸由 MessageSender.setSenderTransport() 指定。此示例通過(guò) HTTP 發(fā)送消息。

          調(diào)用 In-Out 操作

          使用 org.apache.axis2.clientapi.Call 類(lèi)可以方便地調(diào)用 In-Out 操作。調(diào)用 In-Out 操作時(shí),此 Call 類(lèi)支持下列 4 種模式:

          1. 阻塞單傳輸模式:這是調(diào)用 In-Out Web 服務(wù)操作最簡(jiǎn)單的方式。在操作完成和接收到響應(yīng)或錯(cuò)誤之前,服務(wù)調(diào)用被阻塞。它使用一個(gè)傳輸連接同時(shí)發(fā)送和接收響應(yīng),如下面的清單 4 所示。



            清單 4. 阻塞單傳輸模式
            						
            try {
                             
              EndpointReference targetEPR = new EndpointReference(
                  "http://localhost:8080/axis2/services/StockQuoteService");
                           
              // Create request message
              OMFactory fac = OMAbstractFactory.getOMFactory();
              OMNamespace omNs = fac.createOMNamespace(
                  "http://www.developerworks.com/example", "example");
                OMElement payload = fac.createOMElement("getQuote",omNs);
              payload.setText("IBM");
            
              // Create the call
              Call call = new Call();
              call.setTo(targetEPR);
            			
              call.setTransportInfo(Constants.TRANSPORT_HTTP,
                Constants.TRANSPORT_HTTP, false);
              // Invoke blocking
              OMElement result = call.invokeBlocking("getQuote", payload);
                           
              System.out.println("Quote ="+result.getText());
            }catch (AxisFault axisFault) {
                axisFault.printStackTrace();
            }
            

            代碼的第一部分使用 AXIOM 創(chuàng)建請(qǐng)求消息。Call.setTransportInfo() 設(shè)置用于發(fā)送請(qǐng)求和獲得響應(yīng)的傳輸。Call.setTransportInfo() 操作的 Boolean 參數(shù)指出是否要使用不同的傳輸連接來(lái)分別發(fā)送請(qǐng)求和接收響應(yīng)。在本例中,要求用一個(gè) HTTP 連接發(fā)送請(qǐng)求和接收響應(yīng)。

          2. 非阻塞單傳輸模式:在此調(diào)用模式中,只使用下面的一個(gè)傳輸連接獲得非阻塞調(diào)用。如果在一個(gè)客戶(hù)端應(yīng)用程序中要完成多個(gè) Web 服務(wù)調(diào)用,而且不希望每次調(diào)用都阻塞客戶(hù)端,則需要此類(lèi)行為。此時(shí),如果響應(yīng)可用,則調(diào)用立即返回且客戶(hù)端得以回滾,如下面的清單 5 所示。



            清單 5. 非阻塞單傳輸模式
            						
            try {
              EndpointReference targetEPR = new EndpointReference(
                  "http://localhost:8080/axis2/services/StockQuoteService");
                        
              //Create the request
              OMFactory fac = OMAbstractFactory.getOMFactory();
              OMNamespace omNs = fac.createOMNamespace(
                  "http://www.developerworks.com/example", "example");
              OMElement payload = fac.createOMElement("getQuote", omNs);
              payload.setText("IBM");
                  
                        
                // Create the call
                Call call = new Call();
                call.setTo(targetEPR);
                        
                // Set the transport info.
                call.setTransportInfo(org.apache.axis2.Constants.TRANSPORT_HTTP,
                  org.apache.axis2.Constants.TRANSPORT_HTTP, false);
                        
              // Callback to handle the response
                        
                Callback callback = new Callback() {
                  
                  public void onComplete(AsyncResult result) {
                    System.out.println("Quote = "
                      + result.getResponseEnvelope().getBody().getFirstElement()
                        .getText());
                  }
                  
                  public void reportError(Exception e) {
                    e.printStackTrace();
                  }
                };
                        
                        
              // Invoke non blocking
                        
                call.invokeNonBlocking("getQuote", payload, callback);            
                        
              //Wait till the callback receives the response.
                        
                while (!callback.isComplete()) {
                  Thread.sleep(1000);
                }
                        
                        
              call.close();
            } catch (AxisFault axisFault) {
              axisFault.printStackTrace();
            } catch (Exception ex) {
              ex.printStackTrace();
            }
            

            Call.invokeNonBlocking() 方法立即返回而不阻塞。Call.invokeNonBlocking() 采用 org.apache.axis2.clientapi.CallBack 的對(duì)象,如果響應(yīng)來(lái)自服務(wù),則將觸發(fā)此對(duì)象。CallBack 有兩個(gè)抽象方法 onComplete(AsynchResult)reportError(Exception),需要由具體的 CallBack 類(lèi)實(shí)現(xiàn)這些方法。在服務(wù)調(diào)用正常完成后,Axis2 引擎調(diào)用 onComplete() 方法。在從服務(wù)器獲得錯(cuò)誤消息后,調(diào)用 CallbackreportError() 方法。Callback.isComplete() 將指出操作調(diào)用是否完成。

            因?yàn)樯厦鎯蓚€(gè)方法使用一個(gè)傳輸連接來(lái)發(fā)送和接收消息,所以這些方法不適合長(zhǎng)時(shí)間運(yùn)行的事務(wù)。原因是在響應(yīng)可用之前,傳輸連接可能會(huì)超時(shí)。要解決此問(wèn)題,可使用兩個(gè)不同的連接來(lái)分別發(fā)送請(qǐng)求和接收響應(yīng)。但因?yàn)槭褂昧似渌麄鬏斶B接來(lái)獲得響應(yīng),因此需要將請(qǐng)求和響應(yīng)關(guān)聯(lián)起來(lái)。Axis2 支持 WS-Addressing,后者通過(guò)使用 <wsa:MessageID> 和 <wsa:RelatesTo> Header 可解決此問(wèn)題。因此,如果使用兩個(gè)傳輸,則支持對(duì)模塊尋址,如下面兩個(gè)模式所示。

          3. 阻塞雙傳輸模式:此模式在以下情況下非常有用:服務(wù)操作在本質(zhì)上是 In-Out,但使用的傳輸是單向的(如 SMTP)或服務(wù)執(zhí)行需要很長(zhǎng)時(shí)間且 HTTP 連接超時(shí)。請(qǐng)參見(jiàn)下面的清單 6



            清單 6. 阻塞雙傳輸模式
            						
            try{
              EndpointReference targetEPR = new EndpointReference(
                  "http://localhost:8080/axis2/services/StockQuoteService");
                            
              OMFactory fac = OMAbstractFactory.getOMFactory();
              OMNamespace omNs = fac.createOMNamespace(
                  "http://www.developerworks.com/example", "example");
              OMElement payload = fac.createOMElement("getQuote",omNs);
              payload.setText("IBM");
                    
              Call call = new Call();
                call.setTo(targetEPR);
            
                call.setTransportInfo(
                  Constants.TRANSPORT_HTTP, Constants.TRANSPORT_HTTP, true);
            
                //Blocking Invocation
                OMElement result = call.invokeBlocking("getQuote", payload);
              System.out.println("Quote = "+result.getText());
            	
            }catch (AxisFault axisFault) {
                axisFault.printStackTrace();
            }catch (Exception ex) {
                ex.printStackTrace();
            }
            

          4. 非阻塞雙傳輸模式:就 API 級(jí)別和傳輸級(jí)別的非阻塞而言,此模式提供了最大的靈活性,如下面的清單 7 所示。



            清單 7. 非阻塞雙傳輸模式
            						
            try {
                   
              EndpointReference targetEPR = new EndpointReference(
                  "http://localhost:8080/axis2/services/StockQuoteService");
              OMFactory fac = OMAbstractFactory.getOMFactory();
              OMNamespace omNs = fac.createOMNamespace(
                  "http://www.developerworks.com/example", "example");
              OMElement payload = fac.createOMElement("getQuote",omNs);
              payload.setText("IBM");
                    
                       
                Call call = new Call();
                call.setTo(targetEPR);
            
                call.setTransportInfo(
                  Constants.TRANSPORT_HTTP, Constants.TRANSPORT_HTTP, true);
              // Callback to handle the response
                       
                Callback callback = new Callback() {
                public void onComplete(AsyncResult result) {
                  System.out.println("Quote = "
                      + result.getResponseEnvelope().getBody().getFirstElement()
                    .getText());
                  }
            
                public void reportError(Exception e) {
                    e.printStackTrace();
                  }
                };
                        
            
              // Non-Blocking Invocation
                      
                call.invokeNonBlocking("getQuote", payload, callback);
              // Wait till the callback receives the response.
                      
                while (!callback.isComplete()) {
                  Thread.sleep(1000);
                }
                call.close();          
            }catch (AxisFault axisFault) {
                  axisFault.printStackTrace();
            }catch (Exception ex) {
                  ex.printStackTrace();
            }
            





          回頁(yè)首


          總結(jié)

          在這一由兩部分組成的系列的第 1 部分中,您了解了 Axis2 體系結(jié)構(gòu)以及如何使用不同的調(diào)用模式來(lái)部署和使用一個(gè)簡(jiǎn)單的 Web 服務(wù)。在本系列的第 2 部分中,您將詳細(xì)了解該體系結(jié)構(gòu),以及如何通過(guò)添加處理程序和 Axis2 消息接收器來(lái)自定義 Axis2。您還將了解如何使用 Axis2 提供的 XMLBeans 數(shù)據(jù)綁定支持。






          回頁(yè)首


          下載

          描述 名字 大小 下載方法
          StockQuoteService Axis2 Archive file StockQuoteService.aar 3 KB ?FTP
          關(guān)于下載方法的信息 Get Adobe? Reader?




          回頁(yè)首


          參考資料

          學(xué)習(xí)

          獲得產(chǎn)品和技術(shù)

          討論




          回頁(yè)首


          作者簡(jiǎn)介

          Gopalakrishnan U 目前是 IBM India Software Labs 中 Web Services Competency 團(tuán)隊(duì)的一員。他最近兩年一直在 IBM 工作,有超過(guò)三年半的 Java 和 Web 技術(shù)經(jīng)驗(yàn)。在過(guò)去的一年里,他致力于 Web 服務(wù)技術(shù)的研究,為 IBM Web Services ToolKit (WSTK) 做出了貢獻(xiàn)。您可以通過(guò) ugopalak@in.ibm.com 與 Gopalakrishnan 聯(lián)系。


          Shreevidya Rao 是 IBM Software Labs 中 Research Group 的軟件工程師。她過(guò)去一年在 IBM 工作,有五年的 Java 和 J2EE 經(jīng)驗(yàn)。她目前致力于開(kāi)發(fā)分布式可管理的記錄程序。您可以通過(guò) ugopalak@in.ibm.com 與 Shreevidya Rao 聯(lián)系。


          posted on 2006-12-27 14:24 SIMONE 閱讀(1101) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): AXIS
          主站蜘蛛池模板: 育儿| 民丰县| 乌苏市| 通州区| 永仁县| 贵港市| 吉安县| 马山县| 会东县| 华宁县| 茌平县| 平阴县| 岳西县| 靖宇县| 丹阳市| 新巴尔虎右旗| 临沂市| 九江县| 高邑县| 洛扎县| 祁阳县| 宝应县| 搜索| 鲁甸县| 松溪县| 长宁区| 通榆县| 澄江县| 偏关县| 东源县| 宕昌县| 永定县| 开远市| 白沙| 郯城县| 济宁市| 轮台县| 淮南市| 安徽省| 沾化县| 嵊泗县|