国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Web Service實現包--AXIS2學習筆記二

2019-11-18 12:51:16
字體:
來源:轉載
供稿:網友

  客戶端的調用
  
  Web services提供的服務多種多樣,有的可以馬上獲得結果,有的要消耗很長的時間。所以,假如我們需要多種調用方式來對付不同的情況。
  
  大多數的Web services都提供阻塞(Blocking)和非阻塞(Non-Blocking)兩種APIs. 這兩個概念以前應該學過,簡單說一下。
  
  Blocking API - 調用端要等被調用的函數運行完畢才繼續往下走。
  
  Non-Bloking API - 調用端運行完調用函數以后就直接往下走了,調用端和被調用端是異步執行的。返回值是用回調函數來實現的。
  
  這種異步叫做API層異步(API Level Asynchrony)。他們只用到一個連接來發送和接收消息,而且,假如是那種需要運行很長時間的函數,還會碰到Time Out 錯誤,假如用兩個連接分別處理發送和接收消息,調用的時間就可以縮短,也可以解決Time Out 問題。用兩個連接來分別處理發送和接收消息,叫做傳輸層異步(Transport Level Asynchrony)。
  
 Web Service實現包--AXIS2學習筆記二

  理論真無聊,還是來看實例吧。
  
  打開 Eclipse, 創建一個新PRoject, 新建一個叫userguide.clients的包, 把"samples/userguide/src/userguide/clients" 下面的文件都copy到那個包下面, 把AXIS2的lib下面的jar都加到ilbrary里面去(應該不用全加,懶一點就全加了吧.) 發現了關于echo的調用的方式, 居然有五個:
  
  EchoBlockingClient
  EchoBlockingDualClient
  EchoBlockingWsaBasedClient
  EchoNonBlockingClient
  EchoNonBlockingDualClient
  
  一個一個看吧.
  
  EchoBlockingClient.java
  public class EchoBlockingClient {
  private static EndpointReference targetEPR = new EndpointReference("http://localhost:8080/axis2/services/MyService");
  
  public static void main(String[] args) {
  try {
  OMElement payload = ClientUtil.getEchoOMElement();
  Call call = new Call();
  call.setTo(targetEPR);
  call.setTransportInfo(Constants.TRANSPORT_HTTP,
  Constants.TRANSPORT_HTTP,
  false);
  
  //Blocking invocation
  OMElement result = call.invokeBlocking("echo",
  payload);
  
  StringWriter writer = new StringWriter();
  result.serializeWithCache(xmlOutputFactory.newInstance()
  .createXMLStreamWriter(writer));
  writer.flush();
  
  System.out.println(writer.toString());
  
  } catch (AxisFault axisFault) {
  axisFault.printStackTrace();
  } catch (XMLStreamException e) {
  e.printStackTrace();
  }
  }
  }
  
  和一代幾乎一樣, 弄一個EndpointReference, 再弄一個call, 其他不一樣,但是也很簡單, 弄一個OMElement作為參數, 返回也是一個OMElement. 可惜運行居然有錯.
  
  再來看雙通道的版本
  
  EchoBlockingDualClient.java
  public class EchoBlockingDualClient {
  private static EndpointReference targetEPR = new EndpointReference("http://127.0.0.1:8080/axis2/services/MyService");
  
  public static void main(String[] args) {
  try {
  OMElement payload = ClientUtil.getEchoOMElement();
  
  Call call = new Call();
  call.setTo(targetEPR);
  
  call.engageModule(new QName(Constants.MODULE_ADDRESSING));
  call.setTransportInfo(Constants.TRANSPORT_HTTP,
  Constants.TRANSPORT_HTTP,
  true);
  
  //Blocking Invocation
  OMElement result = call.invokeBlocking("echo",
  payload);
  
  StringWriter writer = new StringWriter();
  result.serializeWithCache(XMLOutputFactory.newInstance()
  .createXMLStreamWriter(writer));
  writer.flush();
  System.out.println(writer.toString());
  
  
  //Need to close the Client Side Listener.
  call.close();
  
  } catch (AxisFault axisFault) {
  axisFault.printStackTrace();
  } catch (Exception ex) {
  ex.printStackTrace();
  }
  
  }
  }
  
  加了一句engageModule, 這句話似乎沒什么用,我刪掉這句話也能運行的, 然后setTransportInfo最后一個參數改成了true. 關于setTransportInfo的三個參數, 第一個是發送的Transport, 第二個是接收的Transport, 第三個是"是否雙通道", 支持的搭配形式如下:
  
  http, http, true
  http, http, false
  http,smtp,true
  smtp,http,true
  smtp,smtp,true
  
  看下一個吧,EchoNonBlockingClient,這個是單通道的非阻塞模式:
  
  public class EchoNonBlockingClient {
  private static EndpointReference targetEPR = new EndpointReference("http://127.0.0.1:8080/axis2/services/MyService");
  
  public static void main(String[] args) {
  try {
  OMElement payload = ClientUtil.getEchoOMElement();
  
  Call call = new Call();
  call.setTo(targetEPR);
  call.setTransportInfo(Constants.TRANSPORT_HTTP,
  Constants.TRANSPORT_HTTP,
  false);
  
  //Callback to handle the response
  Callback callback = new Callback() {
  public void onComplete(AsyncResult result) {
  try {
  StringWriter writer = new StringWriter();
  result.getResponseEnvelope().serializeWithCache(XMLOutputFactory.newInstance()
  .createXMLStreamWriter(writer));
  writer.flush();
  System.out.println(writer.toString());
  
  
  } catch (XMLStreamException e) {
  reportError(e);
  }
  }
  
  public void reportError(Exception e) {
  e.printStackTrace();
  }
  };
  
  //Non-Blocking Invocation
  call.invokeNonBlocking("echo", payload, callback);
  
  //Wait till the callback receives the response.
  while (!callback.isComplete()) {
  Thread.sleep(1000);
  }
  
  } catch (AxisFault axisFault) {
  axisFault.printStackTrace();
  } catch (Exception ex) {
  ex.printStackTrace();
  }
  
  }
  }
  
  不同的地方,只是調用的方法從invokeBlocking變成了invokeNonBlocking,然后寫了一個簡單的匿名Callback類作為回調函數。關于這個Callback類,它是一個抽象類,其中有兩個方法:onComplete和reportError,都是client端必須實現的,他還有一個Field,就是complete,可以用來設置和查詢調用是否完成。可惜也不能運行,和上面的錯誤一樣,是在createSOAPMessage的時候報null錯誤。
  
  看下一個EchoNonBlockingDualClient,非阻塞的雙通道:
  
  public class EchoNonBlockingDualClient {
  private static EndpointReference targetEPR = new EndpointReference("http://127.0.0.1:8080/axis2/services/MyService");
  
  public static void main(String[] args) {
  try {
  OMElement payload = ClientUtil.getEchoOMElement();
  
  Call call = new Call();
  call.setTo(targetEPR);
  
  //The boolean flag informs the axis2 engine to use two separate transport connection
  //to retrieve the response.
  call.engageModule(new QName(Constants.MODULE_ADDRESSING));
  call.setTransportInfo(Constants.TRANSPORT_HTTP,
  Constants.TRANSPORT_HTTP,
  true);
  
  //Callback to handle the response
  Callback callback = new Callback() {
  public void onComplete(AsyncResult result) {
  try {
  StringWriter writer = new StringWriter();
  result.getResponseEnvelope().serializeWithCache(XMLOutputFactory.newInstance()
  .createXMLStreamWriter(writer));
  writer.flush();
  System.out.println(writer.toString());
  
  
  } catch (XMLStreamException e) {
  reportError(e);
  }
  }
  
  public void reportError(Exception e) {
  e.printStackTrace();
  }
  };
  
  //Non-Blocking Invocation
  call.invokeNonBlocking("echo", payload, callback);
  
  //Wait till the callback receives the response.
  while (!callback.isComplete()) {
  Thread.sleep(1000);
  }
  //Need to close the Client Side Listener.
  call.close();
  
  } catch (AxisFault axisFault) {
  axisFault.printStackTrace();
  } catch (Exception ex) {
  ex.printStackTrace();
  }
  
  }
  }
  雙通道和單通道基本沒什么不同,只是雙通道的時候,它總是要

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 花垣县| 卓资县| 工布江达县| 青田县| 辽宁省| 宁陕县| 鹤岗市| 和政县| 通河县| 贵溪市| 远安县| 双鸭山市| 边坝县| 黄冈市| 沙洋县| 临夏县| 南靖县| 广西| 张北县| 新泰市| 易门县| 行唐县| 盘锦市| 平舆县| 治县。| 嫩江县| 项城市| 连城县| 南开区| 桑日县| 通辽市| 海原县| 浏阳市| 斗六市| 佛冈县| 土默特左旗| 青神县| 涿鹿县| 思茅市| 上栗县| 凤城市|