JAX-WS 非同步呼叫

來源:互聯網
上載者:User

在JAX-WS實現Glassfish上WebService的非同步呼叫。

 

1.建立服務類

要調用服務,首先要有服務可以調用,我們就自己做一個簡單的Web服務吧。

代碼如下:

package com.sample;<br />import javax.jws.WebMethod;<br />import javax.jws.WebService;</p><p>@WebService<br />public class AddNumber {<br /> @WebMethod<br /> public int add(int a,int b){<br /> return a+b;<br /> }<br />}

將編譯好的class檔案打成war包後部署到Glassfish上。

 

2 建立client的非同步呼叫

在JAX-WS中定義了兩種標準介面:

1)javax.xml.ws.Response此介面繼承Future<T>,提供了polling調用方法。

2)Javax.xml.ws.AsyncHandler,用戶端實現此介面,接收結果使用非同步 callback。

 

 

2.1Polling client

1)撰寫binding.xml檔案,此檔案利用jaxws:enableAsyncMapping綁定定義來設定

   允許非同步呼叫。

 

<bindings<br /> xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="http://localhost:8080/addNumber/AddNumberService?wsdl" xmlns="http://java.sun.com/xml/ns/jaxws"><br /> <bindings node="wsdl:definitions"> <enableAsyncMapping>true</enableAsyncMapping><br /> </bindings><br /> </bindings>

 2)接下來利用ijwsimport工具來產生用戶端代碼:

ijwsimport -keep  http://localhost/asytest/AsyncTestService?wsdl -b ./binding.xml

(其中binding.xml檔案放在產生用戶端代碼的相同目錄下。)

用戶端測試代碼如下:

package test;</p><p>import com.sample.*;<br />import javax.xml.ws.Response;</p><p>public class AsyTest {</p><p> public static void main(String [] args){<br /> AddNumberService service=new AddNumberService();<br /> AddNumber port=service.getAddNumberPort();<br /> Response<AddResponse> asy=port.addAsync(1,2);<br /> while(!asy.isDone()){<br /> System.out.println("is not down");<br /> }<br /> try{<br /> AddResponse callNameResponse=asy.get();<br /> int message=callNameResponse.getReturn();<br /> System.out.println(message);<br /> }catch(Exception ex){}<br /> }<br />}

 

 

2.2 CallBack client 

 


由於此callBack當請求發出去以後當前的這個connection就會關閉 ,為了達到測試的目的,加入了sleep,讓用戶端程式等待伺服器端得返回。

    callback類型的client要傳入一個javax.xml.ws.AsyncHandler類型的匿名內部類,

當soap Message 到達時,Jax-ws會調handleResponse這個方法來處理response. 

用戶端測試代碼如下:

package test;</p><p>import com.sample.*;<br />import javax.xml.ws.AsyncHandler;<br />import javax.xml.ws.Response;</p><p>public class AsyCallTest {<br /> public static void main(String[]args) throws Exception{<br /> AddNumberService service=new AddNumberService();<br /> AddNumber port=service.getAddNumberPort();<br /> port.addAsync(1,2, new AsyncHandler<AddResponse>(){<br /> public void handleResponse(Response<AddResponse>res) {<br /> try {<br /> AddResponse response=null;<br /> response = res.get();<br /> int message=response.getReturn();<br /> System.out.println(message);<br /> }catch(Exception e){<br /> e.printStackTrace();<br /> }}});<br /> Thread.sleep(10000);<br /> }<br />}

 

 

以上就是利用JAX-WS進行Web服務的非同步呼叫的兩種方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.