- 论坛徽章:
- 0
|
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 |
|