免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2016 | 回复: 0
打印 上一主题 下一主题

通过Axis2调用webservice [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-29 17:15 |只看该作者 |倒序浏览

Web 服务调用的特性由 MEP、传输协议以及客户端 API 的同步和/或异步行为决定。
Axis2 当前支持 WSDL 2.0 定义的 In-Only 和 In-Out MEP。
Axis2 客户端 API 支持服务的同步和异步调用。
在调用 In-Out 操作时,在 API 级别和传输级别提供异步行为。
API 级别异步是通过回滚获得的,它使用一个传输连接来同时传输请求和响应(例如,通过一个 HTTP 连接传输请求和响应)。
在传输级别异步中,使用不同的传输连接分别发送请求和接收响应,例如使用 SMTP 进行传输时即如此。
调用 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() 发送请求消息并将其立即返回。
要使用的传输由 MessageSender.setSenderTransport() 指定。
MessageSender类是用于调用IN-ONlY操作。
此示例通过 HTTP 发送消息。
调用 In-Out 操作
阻塞单传输模式:这是调用 In-Out Web 服务操作最简单的方式。在操作完成和接收到响应或错误之前,服务调用被阻塞。它使用一个传输连接同时发送和接收响应
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();}Call.setTransportInfo() 设置用于发送请求和获得响应的传输。Call.setTransportInfo() 操作的 Boolean 参数指出是否要使用不同的传输连接来分别发送请求和接收响应。在本例中,要求用一个 HTTP 连接发送请求和接收响应。
非阻塞单传输模式:在此调用模式中,只使用下面的一个传输连接获得非阻塞调用。如果在一个客户端应用程序中要完成多个 Web 服务调用,而且不希望每次调用都阻塞客户端,则需要此类行为。此时,如果响应可用,则调用立即返回且客户端得以回滚,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 的对象,如果响应来自服务,则将触发此对象。
CallBack 有两个抽象方法 onComplete(AsynchResult) 和 reportError(Exception),需要由具体的 CallBack 类实现这些方法。在服务调用正常完成后,Axis2 引擎调用 onComplete() 方法。在从服务器获得错误消息后,调用 Callback 的 reportError() 方法。Callback.isComplete() 将指出操作调用是否完成。
因为上面两个方法使用一个传输连接来发送和接收消息,所以这些方法不适合长时间运行的事务。原因是在响应可用之前,传输连接可能会超时。要解决此问题,可使用两个不同的连接来分别发送请求和接收响应。但因为使用了其他传输连接来获得响应,因此需要将请求和响应关联起来。Axis2 支持 WS-Addressing,后者通过使用  和  Header 可解决此问题。因此,如果使用两个传输,则支持对模块寻址。
阻塞双传输模式:此模式在以下情况下非常有用:服务操作在本质上是 In-Out,但使用的传输是单向的(如 SMTP)或服务执行需要很长时间且 HTTP 连接超时。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();}
非阻塞双传输模式:就 API 级别和传输级别的非阻塞而言,此模式提供了最大的灵活性。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();}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26845/showart_473174.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP