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() 方法,并以透明方式处理调用的异步性质的详细信息。端点,因此服务实施不会担心客户端是否要等待响应的详细信息。

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

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

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

使用 blocking 模式

在使用块轮询模式时,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);
  }
}