40.5. 使用回调方法实施同步客户端


概述

进行异步操作调用的另一种方法是实施回调类。然后,您将调用异步远程方法,该方法将回调对象用作参数。运行时将响应返回到回调对象。

要实现使用回调的应用程序,请执行以下操作:

  1. 创建 实现 AsyncHandler 接口的回调类。

    注意

    您的回调对象可以执行应用程序所需的任何类型的响应处理。

  2. 使用 operationNameAsync () 进行远程调用,该函数将回调对象用作参数并返回 future&lt ;?> 对象。
  3. 如果您的客户端需要访问响应数据,您可以轮询返回的 future&lt ;?> 对象的 isDone () 方法,以查看远程端点是否发送了响应。

    如果回调对象执行所有响应处理,则不需要检查响应是否已到达。

实现回调

回调类必须实施 javax.xml.ws.AsyncHandler 接口。接口定义了一个方法: handleResponseResponse<T> 重新调用 handleResponse () 方法,以通知客户端响应已到达。例 40.8 “The javax.xml.ws.AsyncHandler Interface” 显示您必须实现的 AsyncHandler 接口的概述。

例 40.8. The javax.xml.ws.AsyncHandler Interface

public interface javax.xml.ws.AsyncHandler
{
  void handleResponse(Response<T> res)
}

例 40.9 “回调实施类” 显示 例 40.1 “用于同步示例的 WSDL Contract” 中定义的 greetMeSometime 操作的回调类。

例 40.9. 回调实施类

package demo.hw.client;

import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Response;

import org.apache.hello_world_async_soap_http.types.*;

public class GreeterAsyncHandler implements AsyncHandler<GreetMeSometimeResponse>
{
  private GreetMeSometimeResponse reply;

  public void handleResponse(Response<GreetMeSometimeResponse>
                             response)
  {
    try
    {
      reply = response.get();
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }
  }

  public String getResponse()
  {
    return reply.getResponseType();
  }
}

例 40.9 “回调实施类” 中显示的回调实现执行以下操作:

定义 member 变量 响应,其中包含从远程端点返回的响应。

实施 handleResponse ()

这种实施只是提取响应并将其分配给 member 变量 回复

实施名为 getResponse () 的添加方法。

此方法是一种方便的方法,可以从 回复 中提取数据并返回数据。

实现消费者

例 40.10 “异步操作调用的回调方法” 演示了使用回调方法对 例 40.1 “用于同步示例的 WSDL Contract” 中定义的 GreetMeSometime 操作进行异步调用的客户端。

例 40.10. 异步操作调用的回调方法

package demo.hw.client;

import java.io.File;
import java.util.concurrent.Future;

import javax.xml.namespace.QName;
import javax.xml.ws.Response;

import org.apache.hello_world_async_soap_http.*;

public final class Client {
  ...

  public static void main(String args[]) throws Exception
  {
    ...
    // Callback approach
    GreeterAsyncHandler callback = new GreeterAsyncHandler();

    Future<?> response =
      port.greetMeSometimeAsync(System.getProperty("user.name"),
                                callback);
    while (!response.isDone())
    {
      // Do some work
    }
    resp = callback.getResponse();
    ...
    System.exit(0);
  }
}

例 40.10 “异步操作调用的回调方法” 中的代码执行以下操作:

实例化回调对象。

调用 greetMeSometimeAsync (),它将使用代理上的回调对象。

这个方法调用会立即将 future <?> 对象返回到客户端。Apache CXF 运行时处理从远程端点接收回复的详情,调用回调对象的 handleResponse () 方法,并填充 Response< GreetMeSometimeResponse > 对象。

注意

运行时将请求传送到远程端点的 greetMeSometime () 方法,并处理调用的异步性质的详细信息,而无需远程端点的知识。端点(因此服务实施)不需要担心客户端要等待响应的详细信息。

使用返回的 Future<?> 对象的 isDone () 方法检查响应是否到达远程端点。

调用回调对象的 getResponse () 方法,以获取响应数据。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.