现在的位置: 首页 > 综合 > 正文

JAX-WS 异步调用

2013年01月27日 ⁄ 综合 ⁄ 共 2852字 ⁄ 字号 评论关闭

JAX-WS实现GlassfishWebService的异步调用。

 

1.创建服务类

要调用服务,首先要有服务可以调用,我们就自己做一个简单的Web服务吧。

代码如下:

[java] view
plain
copy

  1. package com.sample;  
  2. import javax.jws.WebMethod;  
  3. import javax.jws.WebService;  
  4.   
  5. @WebService  
  6. public class AddNumber {  
  7.    @WebMethod  
  8.     public int add(int a,int b){  
  9.         return a+b;  
  10.     }  
  11. }  

将编译好的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绑定定义来设置

   允许异步调用。

 

[xhtml] view
plain
copy

  1. <bindings     
  2.        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">        
  3.        <bindings node="wsdl:definitions">          <enableAsyncMapping>true</enableAsyncMapping>    
  4.       </bindings>    
  5.   </bindings>  

 2)接下来利用ijwsimport工具来生成客户端代码:

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

(其中binding.xml文件放在生成客户端代码的相同目录下。)

客户端测试代码如下:

[java] view
plain
copy

  1. package test;  
  2.   
  3. import com.sample.*;  
  4. import javax.xml.ws.Response;  
  5.   
  6. public class AsyTest {  
  7.   
  8.     public static void main(String [] args){  
  9.         AddNumberService service=new AddNumberService();  
  10.         AddNumber port=service.getAddNumberPort();  
  11.         Response<AddResponse> asy=port.addAsync(1,2);  
  12.         while(!asy.isDone()){  
  13.               System.out.println("is not down");  
  14.         }  
  15.         try{  
  16.             AddResponse callNameResponse=asy.get();  
  17.             int message=callNameResponse.getReturn();  
  18.             System.out.println(message);  
  19.         }catch(Exception ex){}  
  20.     }  
  21. }  

 

 

2.2 CallBack client 

 

由于此callBack当请求发出去以后当前的这个connection就会关闭 ,为了达到测试的目的,加入了sleep,让客户端程序等待服务器端得返回。

    callback类型的client要传入一个javax.xml.ws.AsyncHandler类型的匿名内部类,

soap Message 到达时,Jax-ws会调handleResponse这个方法来处理response. 

客户端测试代码如下:

[java] view
plain
copy

  1. package test;  
  2.   
  3. import com.sample.*;  
  4. import javax.xml.ws.AsyncHandler;  
  5. import javax.xml.ws.Response;  
  6.   
  7. public class AsyCallTest {  
  8.     public static void main(String[]args) throws Exception{  
  9.         AddNumberService service=new AddNumberService();  
  10.         AddNumber port=service.getAddNumberPort();  
  11.         port.addAsync(1,2new AsyncHandler<AddResponse>(){  
  12.             public void handleResponse(Response<AddResponse>res) {  
  13.             try {  
  14.                 AddResponse response=null;  
  15.                 response = res.get();  
  16.                 int message=response.getReturn();  
  17.                 System.out.println(message);  
  18.             }catch(Exception e){  
  19.                 e.printStackTrace();  
  20.             }}});  
  21.             Thread.sleep(10000);  
  22.   }  
  23. }  

 

 

以上就是利用JAX-WS进行Web服务的异步调用的两种方法。

转载来自:http://blog.csdn.net/ooflywing/article/details/5848234

抱歉!评论已关闭.