40.4. 使用轮询方法实施同步客户端
概述
轮询方法简单明了开发异步应用的两种方法。客户端调用名为 OperationNameAsync()
的异步方法,并返回它轮询 响应的 Response<T
> 对象。客户端在等待响应时做什么取决于应用程序的要求。处理轮询的基本模式有两种:
使用非阻塞模式
例 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); } }