CXF之JAX-WS Dispatch API

本文详细介绍了CXF中JAX-WS Dispatch API的使用,包括消息模型和负载模型,以及如何创建Dispatch对象、构建请求消息和进行同步、异步、单向调用。特别强调了Dispatch对象可接受的几种数据类型如Source、SOAPMessage、DataSource和JAXB对象,并解释了在不同场景下的使用方法。

 

 JAX-WS Dispatch API

 

Dispatch对象有两个使用模型:

--消息模型

--负载模型

 

 

.  消息模型

在消息模型中,一个Dispatch对象要使用一个完整的消息。完整的消息包括头与包装器.

你为Despatch对象指定使用消息模型,当你创建Dispatch对象时,要提供java.xml.Service.Mode.MESSAGE值。

 

.  负载模型

在负载模型中,Dispatch对象仅使用消息负载(消息体body)。

你为Despatch对象指定使用负载模型,当你创建Dispatch对象时,要提供java.xml.ws.Service.Mode.PAYLOAD值.

 

 

2 Data Types(数据类型)

Dispatch对象,因为它们是低级别的对象,使用相同的JAXB生成的高级别的消费者API是不被优化的。

Dispatch对象使用下面几个类型:

--javax.xml.transform.Source

--javax.xml.soap.SOAPMessage

--javax.activation.DataSource

--JAXB

 

.  使用Source对象

Dispatch对象能接收与返回派生自javax.xml.transform.Source接口的对象。 Source对象是保存xml文档的低级别对象。

每个Source实现提供方法,访问存储的xml文档并操纵它的内容。

下面的对象实现了Source接口:

--DOMSource

--SAXSource

--StreamSource

注意:当使用Source对象时,开发者要负责确保所有必须的且具体的绑定包装都添加到了消息上。

例如,当一个服务期待SOAP消息交互时,开发人员必须确保所需的SOAP信封添加到传出的请求

并且SOAP信封的内容是正确的。

 

.  使用SOAPMessage对象

当下面条件为真时,Dispatch对象能使用javax.xml.soap.SOAPMessage对象。

--Dispatch对象正使用SOAP binding.

--Dispatch对象正使用message mode(消息模型).

 

.  使用DataSource对象

Dispatch对象能使用实现了javax.activation.DataSource接口的对象,当下面条件为真时:

--Dispatch对象正使用HTTP binding.

--Dispatch对象正使用message mode(消息模型)

DataSource对象提供了一个可以用MIME类型数据的机制,可以来自URL,文件和字节数组。

 

.  使用JAXB对象

虽然Dispatch对象本意是低级别的API, 允许你使用原消息。他们也允许你使用JAXB对象。若要使用

JAXB对象,Dispatch对象必须通过JAXBContext, JAXBContext知道在使用中怎么编组和解组JAXB对象。

Dispatch对象被创建时通过JAXBContext。

JAXBContext理解你能通过JAXB对象作为invoke()方法的参数。你也能放返回消息进JAXB对象,JAXBContext

对象能理解。

 

3 使用Dispatch对象

使用Dispatch对象调用一个远程服务,你要做以下几点:

--创建一个Dispatch对象

--构建一个请求消息

--调用合适的invoke()方法

--解析响应消息

 

.  创建一个Dispatch对象

创建一个Dispatch对象要做以下几步:

--创建一个Service对象,它代表wsdl:service元素定义的服务

--使用Service对象的createDispatch()方法创建Dispatch对象

public Dispatch<T> createDispatch(QName portName,java.lang.Class<T> type,Service.Mode mode)

throws WebServiceException;

如果你使用JAXB对象的createDispatch()方法的签名就是:

public Dispatch<T> createDispatch(QName portName,javax.xml.bind.JAXBContext context,Service.Mode mode)

throws WebServiceException;

下表描述createDispatch()方法的参数:

parameter description

partName wsdl:port元素的指定的QName,它代表Dispatch对象调用上的服务提供者。

type 指定Dispatch对象使用的指定对象的数据类型

mode 指定Dispatch对象的消息使用模型。

 

下面代码是创建一个Dispatch对象并在消息负载模型下使用DOMSource对象:

 

.  构建请求消息(略)

 

.  同步调用

为消费者生成一个同步调用的响应,你使用Dispatch对象的invoke()方法。

T invoke(T msg) throws WebServiceException;

同步的例子:

 

.  异步调用

Dispatch对象支持异步调用. Dispatch对象可以使用轮询与回调两种方式处理异步。

 

当使用轮询方式的invokeAsync()方法时,返回一个Response<T>对象,可以定期轮询它,看看response是否返回。

Response<T> invokeAsync(T msg) throws WebServiceException;

 

当使用回调方式的invokeAsync()方法时,它接受一个AsyncHandler的实现,当response返回时处理它。

Future<?> invokeAsync(T msg,AsyncHandler<T> handler) throws WebServiceException;

 

.  单向调用(OneWay)

当一个请求不需要一个响应的时候,你的远程调用可以使用Dispatch对象上的invokeOneWay()方法。

void invokeOneWay(T msg) throws WebServiceException;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值