在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服務的非同步呼叫的兩種方法。