40.4. 使用轮询方法实施同步客户端


概述

轮询方法比开发异步应用程序的两种方法更为简单。客户端调用名为 OperationNameAsync () 的异步方法,它返回它轮询 响应的 Response<T > 对象。客户端在等待响应时会做什么取决于应用程序的要求。处理轮询有两种基本模式:

  • 非阻塞轮询- 定期通过调用非阻塞 Response<T>.isDone () 方法来查看结果是否已就绪。如果结果就绪,客户端会对其进行处理。如果没有,客户端将继续进行其他操作。
  • 阻塞轮询- 您立即调用 Response<T>.get (),并阻止响应到达(可选指定超时)。

使用非阻塞模式

例 40.6 “非阻塞方法调用异步操作方法” 演示如何使用非阻塞轮询在 例 40.1 “面向异步示例的 WSDL 合同” 中定义的 greetMeSometime 操作中进行异步调用。客户端调用异步操作,并定期检查结果是否返回。

例 40.6. 非阻塞方法调用异步操作方法

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 {
  private static final QName SERVICE_NAME
    = new QName("http://apache.org/hello_world_async_soap_http",
                "SOAPService");

  private Client() {}

  public static void main(String args[]) throws Exception {

    // set up the proxy for the client

    Response<GreetMeSometimeResponse> greetMeSomeTimeResp =
      port.greetMeSometimeAsync(System.getProperty("user.name"));

      while (!greetMeSomeTimeResp.isDone()) {
      // client does some work
      }
      GreetMeSometimeResponse reply = greetMeSomeTimeResp.get();
      // process the response

      System.exit(0);
  }
}

例 40.6 “非阻塞方法调用异步操作方法” 中的代码执行以下操作:

调用代理上的 greetMeSometimeAsync ()

方法调用会立即将 Response<GreetMeSometimeResponse& gt; 对象返回给客户端。Apache CXF 运行时处理从远程端点接收回复的详细信息,并填充 Response<GreetMeSometimeResponse> 对象。

注意

运行时将请求传输到远程端点的 greetMeSometime () 方法,并透明处理调用的异步性质的详细信息。因此,端点(service 实现)不会担心客户端要等待响应的详细信息。

通过检查返回的 Response 对象的 isDone () 来检查响应是否已到达。

如果响应未到达,客户端在再次检查前会继续工作。

当响应到达时,客户端使用 get () 方法从 Response 对象检索它。

使用阻塞模式

在使用块轮询模式时,不会调用 Response 对象的 isDone ()。相反,在调用远程操作后,会立即调用 Response 对象的 get () 方法。get () 块,直到响应可用为止。

您还可以将超时限制传递给 get () 方法。

例 40.7 “阻止异步操作调用方法” 显示使用阻塞轮询的客户端。

例 40.7. 阻止异步操作调用方法

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 {
  private static final QName SERVICE_NAME
    = new QName("http://apache.org/hello_world_async_soap_http",
                "SOAPService");

  private Client() {}

  public static void main(String args[]) throws Exception {

    // set up the proxy for the client

    Response<GreetMeSometimeResponse> greetMeSomeTimeResp =
      port.greetMeSometimeAsync(System.getProperty("user.name"));
    GreetMeSometimeResponse reply = greetMeSomeTimeResp.get();
      // process the response
      System.exit(0);
  }
}
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.