40.5. 使用回调方法实施同步客户端
概述
进行异步操作调用的另一种方法是实施回调类。然后,您将调用异步远程方法,该方法将回调对象用作参数。运行时将响应返回到回调对象。
要实现使用回调的应用程序,请执行以下操作:
创建 实现 AsyncHandler 接口的回调类。
注意您的回调对象可以执行应用程序所需的任何类型的响应处理。
-
使用
operationNameAsync ()
进行远程调用,该函数将回调对象用作参数并返回 future<?>
对象。 如果您的客户端需要访问响应数据,您可以轮询返回的 future<
;?>
; 对象的isDone ()
方法,以查看远程端点是否发送了响应。如果回调对象执行所有响应处理,则不需要检查响应是否已到达。
实现回调
回调类必须实施 javax.xml.ws.AsyncHandler 接口。接口定义了一个方法: handleResponse
Response<T
> 重新调用 handleResponse ()
方法,以通知客户端响应已到达。例 40.8 “javax.xml.ws.AsyncHandler 接口” 显示您必须实现的 AsyncHandler 接口的概述。
例 40.8. javax.xml.ws.AsyncHandler 接口
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 ()
方法,以获取响应数据。