以异步方式调用 JAX-WS Web Service

Java™ API for XML-Based Web Services (JAX-WS) 支持使用异步客户机调用来调用 Web Service。 以异步方式调用 Web Service 时,JAX-WS 支持回调模型和轮询模型。回调模型和轮询模型在 Dispatch client 和 Dynamic proxy client 上可用。

开始之前

开发 JAX-WS Dynamic Proxy 或 Dispatch client。开发 Dynamic proxy client 时,在使用 wsimport 命令根据 Web Service 描述语言 (WSDL) 文件生成可移植客户机工件后,生成的服务端点接口 (SEI) 未将异步方法包括在此接口中。使用 JAX-WS 绑定在 Dynamic proxy client 的接口上添加异步回调或轮询方法。要启用异步映射,您可以将 jaxws:enableAsyncMapping 绑定声明添加至 WSDL 文件。有关添加绑定定制以生成异步接口的更多信息,请参阅 JAX-WS 规范第 8 章。

支持的配置 支持的配置: 如果运行 wsimport 工具并通过使用 JAX-WS enableAsyncMapping 绑定声明来启用异步调用,请确保 WSDL 文件中对应的响应消息未包含部件。如果响应消息未包含部件,那么请求将充当双向请求,但回送的实际响应为空。wsimport 工具无法正确地处理空响应。要避免这种情况,您可以从操作(它使您的操作变为单向操作)中移除输出消息,也可以向您的消息中添加 <wsdl:part>。有关 wsimport 工具的用法、语法和参数的更多信息,请参阅 JAX-WS 应用程序文档中的 wsimport 命令。sptcfg

关于此任务

对 Web Service 的异步调用将请求发送至服务端点,然后立即将控制权返回给客户机程序,而不等待响应从服务返回。JAX-WS 异步 Web Service 客户机通过回调方法或轮询方法来使用 Web Service。通过使用轮询模型,客户机可以发出请求和接收所轮询的响应对象,以确定服务器是否响应。当服务器响应时,将检索到实际的响应。通过使用回调模型,客户机提供回调处理程序来接受和处理入站响应对象。当结果可用时,将调用处理程序的 handleResponse() 方法。轮询模型和回调模型都支持客户机集中于继续处理工作,而不等待响应返回,同时提供一个更动态和更有效的模型来调用 Web Service。从 Enterprise JavaBeans (EJB) 客户机或 Java Platform, Enterprise Edition (Java EE) 应用程序客户机轮询调用是有效的。只有从 Java EE 应用程序客户机进行回调调用时,回调调用才有效。

使用回调异步调用模型
为了实现使用回调模型的异步调用,客户机提供了 AsyncHandler 回调处理程序来接受和处理入站响应对象。客户机回调处理程序实现 javax.xml.ws.AsyncHandler 接口,该接口包含从服务器接收异步响应时运行的应用程序代码。javax.xml.ws.AsyncHandler 接口包含运行时从服务器接收到异步响应并对其进行处理后调用的 handleResponse(java.xml.ws.Response) 方法。以 javax.xml.ws.Response 对象的形式将响应传递给回调处理程序。当调用 get() 方法时,响应对象将返回响应内容。另外,如果接收到错误,那么在执行该调用期间,还将向客户机返回异常。随后根据 Executor 方法所使用的线程技术模型来调用 Response 方法,Executor 方法是客户机的 java.xml.ws.Service 实例上用于创建 Dynamic Proxy 或 Dispatch client 实例的 java.util.concurrent.Executor。Executor 用于调用由应用程序注册的任何异步回调。使用 setExecutorgetExecutor 方法来修改和检索对服务配置的 Executor。
使用轮询异步调用模型
通过使用轮询模型,客户机可以请求和接收响应对象,随后可以对该响应对象进行轮询以确定服务器是否已响应。当服务器响应时,将检索到实际的响应。当调用 get() 方法时,响应对象将返回响应内容。客户机从 invokeAsync 方法接收 javax.xml.ws.Response 类型的对象。该 Response 对象用于监视对服务器的请求的状态、确定操作的完成时间以及检索响应结果。
使用异步消息交换
缺省情况下,异步客户机调用在连线上没有消息交换模式的异步行为。编程模型是异步的,但是,与服务器交换请求或响应消息的过程不是异步的。要使用异步消息交换,必须在客户机请求上下文上将 com.ibm.websphere.webservices.use.async.mep 属性的布尔值设置为 true。启用此属性时,在客户机与服务器之间交换的消息有别于以同步方式交换的消息。借助异步交换,请求和响应消息添加了 WS-Addressing 头,以便为消息提供其他路由信息。异步消息交换与同步消息交换之间的另一重要差别是:响应传递至异步侦听器,然后异步侦听器将该响应传递回至客户机。对于异步交换,不会发送任何超时来通知客户机停止侦听响应。要强制客户机停止等待响应,请对从轮询调用返回的对象发出 Response.cancel() 方法或者对从回调调用返回的对象发出 Future.cancel() 方法。在处理请求时,cancelResponse 不会影响服务器。
避免故障 避免故障: 异步侦听器的位置将发送至服务器,因此服务可以对客户机作出应答。在 Windows 操作系统上,缺省情况下使用本地主机名,因为它与动态主机配置协议 (DHCP) 兼容。但是,如果服务器无法解析该主机名,那么客户机应用程序将无法接收到来自目标服务的应答。例如,在工作站 myhost.bar.com 上主管客户机应用程序。在以下 SOAP 消息头中,客户机应用程序将短名称 myhost 作为其主机详细信息来发送。如果目标服务器无法将 myhost 解析为 myhost.bar.com,那么后续应答将不能到达客户机应用程序:
  <soapenv:Header>     
    <wsa:To>http://target.bar.com:81/LiteSecurityService/SecurityService</wsa:To>
    <wsa:ReplyTo>         
      <wsa:Address>http://myhost:2146/axis2/services/LiteSecurityService.
        WSRMServicePort/AnonOutInOp?IBMwebservicesID=922A5DC38A337C4CEF1168347862705
      </wsa:Address>
    </wsa:ReplyTo>
    <wsa:MessageID>urn:uuid:922A5DC38A337C4CEF1168347862403</wsa:MessageID>
    <wsa:Action>getEndpointReference</wsa:Action>
  </soapenv:Header>
要解决此问题,请配置客户机,将以下系统属性添加到 Java 虚拟机,以便用 IP 格式来发送异步侦听器的位置详细信息。注意,如果传输 IP 地址,您将无法享受到 DHCP 所带来的好处。
-Dcom.ibm.websphere.webservices.transportEPRInIPAddr=yes
gotcha

过程

  1. 确定是否要实现客户机的回调方法或轮询方法,以便以异步方式调用 Web Service。
  2. (可选)配置客户机请求上下文。
    com.ibm.websphere.webservices.use.async.mep
    属性添加至请求上下文以便对 Web Service 客户机启用异步消息传递。使用此属性要求服务端点支持缺省情况下受应用程序服务器支持的 WS-Addressing。以下示例说明如何设置此属性:
    Map<String, Object> rc = ((BindingProvider) port).getRequestContext();
     rc.put("com.ibm.websphere.webservices.use.async.mep", Boolean.TRUE);
  3. 要实现异步回调方法,请执行以下步骤。
    1. 在 SEI 或 javax.xml.ws.Dispatch 接口上找到异步回调方法。对于 SEI,此方法名以 Async 结尾,并且它具有的参数数目比类型为 javax.xml.ws.AsyncHandler 的同步方法的参数数目多一个。invokeAsync(Object, AsyncHandler) 方法是一个在 Dispatch 接口上使用的方法。
    2. (可选)对客户机应用程序添加 service.setExecutor 方法。添加 Executor 方法将授予客户机对调度方法的控制权,以处理响应。另外,还可以选择使用 java.current.Executors 类工厂来获取封装的 Executor 或实现您自己的 Executor 类。请参阅 JAX-WS 规范,以了解有关将 Executor 类方法与客户机配合使用的更多信息。
    3. 实现 javax.xml.ws.AsyncHandler 接口。javax.xml.ws.AsyncHandler 接口只有 handleResponse(javax.xml.ws.Response) 方法。此方法必须包含用于处理响应或可能的异常的逻辑。在客户机运行时从服务器接收到异步响应并对其进行处理后调用此方法。
    4. 使用参数数据和回调处理程序来调用异步回调方法。
    5. 当响应可用时,将对回调对象调用 handleResponse(Response) 方法。在此方法中调用 Response.get() 方法以传递响应。
  4. 要实现轮询方法:
    1. 在 SEI 或 javax.xml.ws.Dispatch 接口上找到异步轮询方法。对于 SEI,此方法名以 Async 结尾,并且它具有返回类型 javax.xml.ws.Response。在 Dispatch 接口上使用 invokeAsync(Object) 方法。
    2. 使用参数数据调用异步轮询方法。
    3. 客户机接收对象类型 javax.xml.ws.Response,该对象类型用于监视对服务器的请求的状态。isDone() 方法指示调用是否已完成。当 isDone() 方法返回值 true 时,将调用 get() 方法以检索响应对象。
  5. 如果客户机需要停止等待来自服务的响应,请对回调或轮询方法使用 cancel() 方法。 如果客户机调用了 cancel() 方法,那么端点将继续处理请求。但是,将停止对客户机的等待和响应处理。

结果

您启用了 JAX-WS Web Service 客户机以便以异步方式调用和使用 Web Service。请参阅 JAX-WS 规范,以了解有关异步客户机 API 的其他信息。

示例

以下示例举例说明了包含相应方法的 Web Service 接口,这些方法适用于来自客户机的异步请求。
@WebService

public interface CreditRatingService {
       // Synchronous operation.
       Score getCreditScore(Customer     customer);
       // Asynchronous operation with polling.
       Response<Score> getCreditScoreAsync(Customer customer);
       // Asynchronous operation with callback.
       Future<?> getQuoteAsync(Customer customer, 
              AsyncHandler<Score> handler);
}
使用回调方法
回调方法需要回调处理程序,如以下示例所示。如果使用的是回调过程,那么在作出请求后,回调处理程序将负责处理响应。响应值是响应,也可能是异常。Future<?> 方法表示异步计算的结果,并且将对该方法进行检查以查看计算是否完整。如果需要应用程序了解请求是否完成,请调用 Future.isDone() 方法。请注意 Future.get() 方法未提供有意义的响应,并且与 Response.get() 方法不相似。
CreditRatingService svc = ...;
 
Future<?> invocation = svc.getCreditScoreAsync(customerTom,
       new AsyncHandler<Score>() {
              public void handleResponse (
                     Response<Score> response)
                  {
                     score = response.get();
                     // process the request...
                  }
    }
);
使用轮询方法
以下示例举例说明了异步轮询客户机:
CreditRatingService svc = ...;
Response<Score> response = svc.getCreditScoreAsync(customerTom);
 
while (!response.isDone()) {
       // Do something while we wait.
}

score = response.get();

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxwsclientasync
文件名:twbs_jaxwsclientasync.html