web服务的异步模型
除了普通的同步调用方式,CXF也支持两种异步的调用方式:
. Polling approach(轮询):
这种情况下调用远程方法,返回一个javax.xml.ws.Response实例。这个Response对象继承自javax.util.concurrency.Future接口,
它被轮询,检查响应消息是否已经到达。
. Callback approach(回调):
在这种情况下调用一个远程方法,你调用一个特殊的方法,它以一个回调对象作为其参数之一。(是javax.xml.ws.AsyncHandler类型).
每当响应消息到达客户端时,CXF运行AsyncHandler对象上的回调方法并给它响应消息的内容。
生成异步存根代码
在这里,定制用来切换异步调用功能。使用绑定声明来指定定制, 定义使用jaxws:bindings标签(jaxws前缀是绑在
http://java.sun.com/xml/ns/jaxws命名空间). 这里有指定绑定声明的两个可选的方法:
. 外部绑定声明:jaxws:bindings元素被定义在wsdl合约文件之外的单独文件中。当你使用wsdl2java生成存根代码时,
你指定绑定声明文件的地址
. 嵌入式的绑定声明:你也能直接嵌入jaxws:bindings元素在wsdl合约中,像wsdl扩展一样处理它。即然这样,
jaxws:bindings设置仅应用到当前的父元素。
这里我们只考虑第一点(外部绑定声明),下面是一个对于异步调用的外部绑定声明文件的模板. 如例:
例如,如果你仅仅想为GreeterAsync端口类型生成异步方法,你可以在指定的绑定声明中指定
<bindings node="wsdl:definitions/wsdl:portType[@name='GreeterAsync']">
假设这个绑定声明被保存在一个文件中,async_binding.xml。通过下面的wsdl2java命令,你能生成异步支持的必须的存根文件。
命令 : wsdl2java -client -d ClientDir -b async_binding.xml hello_world.wsdl
当你运行wsdl2java命令的时候,你指定绑定声明文件的地址使用 -b 选项。