深入探索JAXM与JAX-RPC:Web服务消息传递的关键技术
立即解锁
发布时间: 2025-08-17 01:24:15 阅读量: 2 订阅数: 15 

### 深入探索JAXM与JAX - RPC:Web服务消息传递的关键技术
#### 1. 消息交换模式
客户端与服务器之间的消息交换可以采用同步和异步两种模式,具体的消息交换模式如下:
- **异步查询(Asynchronous Inquire)**:发送消息并必须接收响应(非立即接收,而是在未来某个时间点)。
- **带确认的异步更新(Asynchronous Update with Acknowledgement)**:发送消息并必须接收特定的确认信息。
- **同步更新(Synchronous Update)**:发送消息,发送方会阻塞直到收到响应。
- **同步查询(Synchronous Inquiry)**:与同步更新类似,但响应仅用于解除客户端的阻塞。
- **即发即弃(Fire and Forget)**:发送消息,不期望或不接收响应。
#### 2. 连接
通过JAXM交换的所有消息都是通过连接进行发送和接收的。连接代表客户端(发送方)与其对应的服务(接收方)之间的任何链接。根据开发的客户端类型,可以选择直接连接到服务,或者连接到消息提供者,由消息提供者将消息路由到最终目的地。
连接使用典型的工厂模式创建:
- 若要创建到服务的直接连接(点对点连接),可调用`SOAPConnectionFactory.newInstance()`方法,该方法将返回一个`SOAPConnection`对象,可用于与服务的所有同步交互。
- 对于异步消息传递,可调用`ProviderConnectionFactory.newInstance()`方法创建`ProviderConnection`。
#### 3. JAXM包结构
最初引入JAXM时,其所有类和接口都包含在`javax.xml.messaging`包中。但由于JAXM依赖于SAAJ,而SAAJ的API可以独立于JAXM存在,因此将SAAJ的元素从JAXM包中分离出来,形成了`javax.xml.soap`包。JAXM仍然依赖于`javax.xml.soap`包,但`javax.xml.soap`包不依赖于`javax.xml.messaging`包。以下是两个包中的一些关键类和接口:
| `javax.xml.messaging` | `javax.xml.soap` |
| --- | --- |
| `ProviderConnectionFactory` | `SOAPConnectionFactory` |
| `ProviderConnection` | `SOAPConnection` |
| `ProviderMetaData` | `SOAPEnvelope` |
| `ReqRespListener` | `SOAPHeader` |
| `OneWayListener` | `SOAPBody` |
| `EndPoint` | `AttachmentPart` |
| `JAXMException` | `SOAPFault` |
#### 4. 配置文件
JAXM默认支持SOAP 1.1和带附件的SOAP规范。此外,JAXM架构允许通过配置文件扩展SOAP模型以支持其他协议。这些配置文件定义了额外的消息规范,使消息能够符合各种新的协议要求。接收到的具有特定配置文件的消息将包含该配置文件协议中约定的特定头部属性。每个配置文件都配有一个API,用于支持对这些自定义头部属性的处理和操作。在JAXM中,包含了用于ebXML和SOAP - RP配置文件的API。
#### 5. JAXM与JMS的比较
JMS和JavaMail实现通常依赖于某种形式的消息导向中间件(MOM)或邮件基础设施来传输和管理消息,这种模式在某些问题领域仍然有效,特别是在更可控的开发环境中。而JAXM专注于成为以Web为中心的消息解决方案,拥抱SOAP在众多应用程序和编程环境中自由流动的Web服务愿景。与JMS相比,JAXM具有以下特点:
- **轻量级**:一般认为JAXM是比JMS更轻量级的解决方案。
- **支持同步点对点连接**:JMS开发者无法使用此功能。
#### 6. 构建客户端
构建JAXM客户端通常遵循以下基本步骤:
1. 从JAXM的连接工厂创建连接。
2. 构造消息。
3. 填充消息内容。
4. (如果有)向消息添加附件。
5. 发送消息。
6. 接收响应。
7. 从接收到的消息中提取内容。
##### 6.1 构建独立客户端
独立客户端不使用消息提供者,并且仅限于同步通信。以下是构建独立客户端的具体步骤和代码示例:
- **获取连接**:
```java
SOAPConnectionFactory connFactory = SOAPConnectionFactory.newInstance();
SOAPConnection conn = connFactory.createConnection();
```
- **构造消息**:
```java
// get the SOAP elements
MessageFactory msgFactory = MessageFactory.newInstance();
SOAPMessage msg = msgFactory.createMessage();
SOAPPart soapPart = msg.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPHeader header = envelope.getHeader();
SOAPBody body = envelope.getBody();
header.detachNode();
// create a name for our service entry point
Name methodName =
envelope.createName("GetHoroscope", "ASTRO", "http://www.astro.com");
SOAPBodyElement getHoroscope = body.addBodyElement(methodName);
// add parameter birth date
Name dobParamName = envelope.createName("DateOfBirth");
SOAPElement dobParam = getHoroscope.addChildElement(dobParamNa
```
0
0
复制全文
相关推荐









