麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Web Service實現(xiàn)包--AXIS2學(xué)習(xí)筆記二

2019-11-18 12:51:16
字體:
供稿:網(wǎng)友

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

  理論真無聊,還是來看實例吧。
  
  打開 Eclipse, 創(chuàng)建一個新PRoject, 新建一個叫userguide.clients的包, 把"samples/userguide/src/userguide/clients" 下面的文件都copy到那個包下面, 把AXIS2的lib下面的jar都加到ilbrary里面去(應(yīng)該不用全加,懶一點就全加了吧.) 發(fā)現(xiàn)了關(guān)于echo的調(diào)用的方式, 居然有五個:
  
  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作為參數(shù), 返回也是一個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最后一個參數(shù)改成了true. 關(guān)于setTransportInfo的三個參數(shù), 第一個是發(fā)送的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();
  }
  
  }
  }
  
  不同的地方,只是調(diào)用的方法從invokeBlocking變成了invokeNonBlocking,然后寫了一個簡單的匿名Callback類作為回調(diào)函數(shù)。關(guān)于這個Callback類,它是一個抽象類,其中有兩個方法:onComplete和reportError,都是client端必須實現(xiàn)的,他還有一個Field,就是complete,可以用來設(shè)置和查詢調(diào)用是否完成。可惜也不能運行,和上面的錯誤一樣,是在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();
  }
  
  }
  }
  雙通道和單通道基本沒什么不同,只是雙通道的時候,它總是要

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 成年人在线视频免费 | 久久久久国产精品久久久久 | 激情大乳女做爰办公室韩国 | 久久午夜国产 | 中国成人在线视频 | 成人三级视频网站 | 日本xxxx视频 | 国产精品久久久久久久午夜片 | 欧美一级视频免费看 | 黄色影院在线观看视频 | 欧美a∨一区二区三区久久黄 | 成人午夜视频在线观看免费 | 亚洲午夜久久久精品一区二区三区 | 国产一区二区三区欧美 | 中文字幕网在线 | 免费黄色一级网站 | 欧美羞羞视频 | 日韩理论电影网 | japanese xxxxhd| 911色_911色sss主站色播 | 精品国产一区二区三区久久久蜜月 | 天天夜天天操 | 91久久久久久亚洲精品禁果 | 热99热 | 中文字幕在线网站 | 黄色大片在线观看 | 久久久久久久一区 | 欧美精品久久久久久久久老牛影院 | 久久久久久亚洲国产精品 | 一级免费特黄视频 | 一区二区国产在线 | 国产成人高清成人av片在线看 | 午夜精品视频在线 | 精品国产专区 | 天天干天天碰 | 久久久一二三 | 国产精品爱久久久久久久 | 欧美一级黄色录像片 | 亚洲第一成人在线 | 日韩一级免费毛片 | 黄色毛片观看 |