40.4. 使用轮询方法实施同步客户端
概述
轮询方法是开发异步应用的两种方法更为简单。客户端调用名为 OperationNameAsync ()
的异步方法,并返回 Response<T
> 对象来轮询响应。客户端在等待响应时执行的操作取决于应用程序的要求。处理轮询有两种基本模式:
使用非阻塞模式
例 40.6 “对异步操作调用的非阻塞方法” 演示使用非阻塞轮询来对 例 40.1 “用于同步示例的 WSDL Contract” 中定义的 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
> 对象返回到客户端。Apache CXF 运行时处理从远程端点接收回复的详细信息,并填充 Response<GreetMeSometimeResponse>
对象。
运行时将请求传送到远程端点的 greetMeSometime ()
方法,并透明处理调用的异步性质的详细信息。端点(因此服务实现)不会担心客户端要等待响应的详细信息。
通过检查返回的 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); } }