- 浏览: 932397 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (251)
- WebService (17)
- IBatis (22)
- Hibernate (1)
- SpringMVC - 基础篇 (32)
- Spring (15)
- Java (11)
- JVM及调优 - 基础篇 (4)
- 集群 (14)
- 数据库 (17)
- WebSphere (5)
- 多线程 (4)
- 集合、容器 (2)
- DB Pool (1)
- Power Designer (5)
- Maven基础 (5)
- JS (14)
- WEB 前端 (5)
- 实用小工具 (17)
- 社会、人 (2)
- 乱七八糟 (18)
- ASM&CGLIB - 基础篇 (12)
- 缓存 (1)
- 性能 (1)
- 设计之殇 (1)
- 分布式事务 (1)
- 单点登录 (11)
- 分布式 Session (4)
- Memcached - 基础篇 (6)
最新评论
-
一笑_奈何:
楼主写的还真行不错。
扫盲贴 - J2EE集群之JNDI集群实现 -
xuezhongyu01:
博主写的很详细,但最后还是没明白,最后调用BasicDataS ...
Spring中的destroy-method方法 -
Mr梁:
commons-fileupload.jar commons- ...
SpringMVC 中文件上传 MultipartResolver -
Eywa:
总结的很不错
ORACLE CASE WHEN 及 SELECT CASE WHEN的用法 -
TryRelax:
fastjson 比 jackson 好用吧?
Spring MVC Jackson DateFormat
一、几个相关的概念
1、MTOM基础概念
MTOM(Message Transmission Optimization Mechanism)消息优化传输机制。
它提出的模型适用于大量数据的交互情况。针对Base64编码情况带来的开销提出的解决方案。当数据量小的时候,SOAP依然使用XML进行消息的传递。
消息传输优化机制 (MTOM) 标准允许将消息中包含的大型数据元素外部化,并将其作为无任何特殊编码的二进制数据随消息一起传送。MTOM 消息会打包为多部分/相关 MIME 序列,放在SOAP 消息中一起传送。
但是在大量数据情况下,如果数据依然进行Base64编码,会带来33%的额外开销,这样的情况对于大量数据交换的情况是无法容忍的。MTOM 就是针对SOAP 消息传输的基础上提出的改进办法。对于大量数据的传递,不会进行进行Base64编码,而是直接以附件的二进制原始数据的形式封装在SOAP消息的 MIME 部分,进行传输。SOAP 消息通过指向随其发送的 MIME 部分来引用二进制内容,另外包括SOAP基本的XML 数据,这些还是Base64编码。因为此模型与简单邮件协议SMTP 模型基本一致。
MTOM通过简化大量数据的编码过程,从而提高数据的处理效率。因为SOAP消息等必要的信息,MTOM 也有一些必要的开销。MTOM仅在二进制数据元素的大小超过大约 1 KB 时,才能体现出其优势。
什么是BASE64编码、MTOM消息优化传输机制、MIME。这些对于我们理解MTOM消息优化传输机制问题非常的必要。
2、BASE64编码
BASE64编码 的原理很简单,其方法是,将输入数据流每次取6 bit(每bit代表1位二进制),不足6bit的补0,这样,每3个8位字节将编码为4个6位字节(3×8 → 4×6);不满4个字节的以“=”填充。其实这4个六位字节 仍然是8位,只不过高两位被设置为0。当一个字节只有6位有效时,它的取值空间为0 到 2的6次方减1 即63,也就是说被转换的Base64编码的每一个编码的取值空间为(0~63)。
这样就可以将3个8位字节,转换为4个字节,这4个转换的字节都可以映射到字符中。也即数据都可以使用字符编码代替。 因为转换后的字符串要比原来的多一个字节,长1/3。因此编码后的数据长度增加到4/3倍。这里也是为什么使用SOAP消息效率比MTOM低的原因。因为 SOAP使用XML语言进行消息传递,XML是基于BASE64编码的语言。
3、MIME
MIME表示多用途Internet邮件扩允协议。MIME扩允了基本的面向文本的Internet邮件系统,以便可以在消息中包含二进制附件。MIME(Multipurpose Internet Mail Extentions),一般译作"多用途的网络邮件扩充协议"。顾名思义,它可以传送多媒体文件。 MIME (Multipurpose Internet Mail Extensions,多目的Internet邮件扩展)是创建用于电子邮件交换,网络文档,及企业网和Internet上的其他应用程序中的文件格式的规范。
二、MTOM之旅
1、POJO
package org.wy.pojo; import javax.activation.DataHandler; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlMimeType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class User { private String name = "wy"; private String sex = "man"; public int age = 20; //private Address address; //注这是一个附件类型的数据 @XmlMimeType("application/octet-stream") private DataHandler dataHandler; public String getName() { return name; } public void setName(String name) { this.name = name; } //处理复杂的对象 /*@XmlJavaTypeAdapter(AddressAdapter.class) public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; }*/ public DataHandler getDataHandler() { return dataHandler; } public void setDataHandler(DataHandler dataHandler) { this.dataHandler = dataHandler; } }
MTOM 方式中要传输的附件必须使用javax.activation.DataHandler 类,还要注意必须在类上使用@XmlAccessorType(XmlAccessType.FIELD)注解,标注JAXB 在进行JAVA 对象与XML 之间进行转换时只关注字段,而不关注属性(getXXX()方法)。
然后使用@XmlMimeType 注解标注这是一个附件类型的数据,这里我们标注imageData 是一个二进制文件,当然你也可以使用具体的MIME类型,譬如:image/jpg、image/gif 等,但要考虑到客户端是否支持。
2、接口类
package org.wy.service; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.xml.ws.soap.MTOM; import org.wy.pojo.User; @WebService(name="userService") //name属性标注在接口类上,可以指定wsdl中接口名称,也就是生成的客户端代码中接口类的名字。 @SOAPBinding(style = SOAPBinding.Style.RPC) //指定SOAP消息样式 @MTOM //开启MTOM功能 public interface IUserService { public User getUser(); }
@MTOM注解用于开启MTOM功能。
@WebService注解中的name属性标注在接口类上,可以指定wsdl中接口名称,也就是生成的客户端代码中接口类的名字。
@SOAPBinding(style = SOAPBinding.Style.RPC)指定SOAP消息样式,有两个枚举值:SOAPBinding.Style.DOCUMENT(默认)和 SOAPBinding.Style.RPC,可以对比这两种方式生成的wsdl会有所不同,而且生成的客户端代码也会有所不同。
实现类:
package org.wy.service.impl; import java.io.File; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.jws.WebService; import org.wy.pojo.User; import org.wy.service.IUserService; /** * * @author wy * */ @WebService public class UserServiceImpl implements IUserService{ public User getUser() { User user = new User(); user.setName("wy"); user.setDataHandler(new DataHandler(new FileDataSource(new File("D:\\resume\\logo.gif")))); return user; } }
3、服务端配置
applicationContext-cxf.xml
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- 导入资源 --> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <!-- <jaxws:endpoint implementor="org.wy.service.impl.UserServiceImpl" address="/UserService"/> --> <!-- 使用bean --> <jaxws:endpoint implementor="#userService" address="/UserService" /> </beans>
在命令行键入“wsimport -p org.wy.client -keep http://localhost:8080/WebServiceCXF/services/UserService?wsdl”生成客户端代码,拷贝到工程相应文件夹
当然也可以使用CXF中的wsdl2java命令生成客户端。
这时,就可以调用这个服务了:
测试类:
package org.wy.jdkclienttest; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import javax.activation.DataHandler; import org.wy.jdkclient.User; import org.wy.jdkclient.UserServiceImplService; /** * * @author wy * */ public class Test { public static void main(String[] args) throws IOException { UserServiceImplService userService = new UserServiceImplService(); User user = userService.getUserServiceImplPort().getUser(); String name = user.getName(); int age = user.getAge(); String sex = user.getSex(); System.out.println(name+"\r\n"+age+"\r\n"+sex); //输出传递过来的文件 DataHandler dataHandler = user.getDataHandler(); String fileName = dataHandler.getName(); String fileType = dataHandler.getContentType(); Object content = dataHandler.getContent(); System.out.println(fileName+"\r\n"+fileType+"\r\n"+content.toString()); //Streaming Mode InputStream is = dataHandler.getInputStream(); FileOutputStream fos = new FileOutputStream("D:\\logo.gif"); byte[] bytes = new byte[2048]; int len = 0; while((len = is.read(bytes))!=-1){ fos.write(bytes, 0, len); } fos.flush(); fos.close(); is.close(); } }
来看下结果:
2011-12-25 14:03:49 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL 信息: Creating Service {http://impl.service.wy.org/}UserServiceImplService from WSDL: http://localhost:8080/WebServiceCXF/services/UserService?wsdl name= wy age= 20 sex= man fileName= null fileType= image/gif fileContent= org.apache.cxf.attachment.DelegatingInputStream@11e1bbf
附件中是上一篇和本篇的代码。
- WebServiceCXF.zip (47.5 KB)
- 下载次数: 475
发表评论
-
WebService CXF JAXB角色及简单使用
2011-12-24 22:23 3655WebService传递XML文档,当然也可以传递JSON对象 ... -
WebService CXF SOAP基本结构
2011-12-24 18:20 2085SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP ... -
WebService CXF WSDL描述
2011-12-24 18:16 1296原文http://www.ibm.com/develo ... -
Sping3+CXF Web应用
2011-12-24 00:21 1493一、准备环境 Apache Cxf 2.4.5 ... -
WebService CXF下的Service(URL, QName, WebServiceFeature[]) is undefined
2011-09-21 21:11 2699Service(URL, QName, WebServiceF ... -
WebService CXF 如何设置 timeout
2011-05-21 09:31 4378由于用CXF构建的webservice使用的是spring配置 ... -
让Apache CXF 支持传递java.sql.Timestamp和java.util.HashMap类型
2011-05-02 12:46 2483让Apache CXF 支持传递java.sql.Timest ... -
WebService CXF 中的拦截器(Interceptor)
2011-05-02 12:38 3592CXF的Interceptor在每个请求响应之前或响应之后,做 ... -
WebService CXF中传递复杂类型对象
2011-05-02 12:07 12977前面一篇文章介绍的都是传递简单的字符串,现在开始介绍传递复杂类 ... -
WebService CXF --- 由WSDL文件开发Client端
2011-04-30 17:49 3870WSDL文件:http://www.webxml.com.cn ... -
WebService CXF----JAX-RPC 与 JAX-WS
2011-04-30 10:00 4390Web服务: 1、SOAP 2、WSDL ... -
WebService CXF --- 创建基础的示例
2011-04-09 16:11 15751、开发环境: cxf-2.3.3 ... -
WebService CXF --- CXF简单介绍
2011-04-09 14:48 41781、WebService介绍 WebService让 ... -
Web Service中的XFire 传输List、Map 自定义对象
2011-04-05 09:14 7835简单记录XFire中怎么传输对象的实现,以备查阅;又不正确的地 ... -
一个基础的XFire WebService快速开发
2011-04-03 09:03 1564环境: XFire-1.2.6 JDK1.5 MyEcl ... -
axis和xfire以及CXF
2011-04-03 08:51 1549由于最近使用WebService,于是到网上疯狂搜索,找点资料 ...
相关推荐
- **MTOM/XOP**:对于大型二进制数据,CXF支持MTOM(Message Transmission Optimization Mechanism)和XOP(XML-binary Optimized Packaging),提高传输效率。 - **拦截器和处理器**:CXF提供了丰富的拦截器和...
5. **MTOM和SwA支持**:CXF实现了Message Transmission Optimization Mechanism (MTOM) 和 Soap with Attachments (SwA),这两者都提高了处理大型二进制数据的效率。 6. **Spring集成**:CXF与Spring框架深度集成,...
4. **传输和编码**:CXF提供了多种传输方式,如HTTP、HTTPS、JMS等,以及多种编码方式,如MTOM(Message Transmission Optimization Mechanism)和SWA(Simple Object Access Protocol)。 5. **客户端API**:CXF...
- **兼容性**:CXF支持多种Web服务规范,包括JAX-WS、JAX-RS、MTOM、SAAJ等。 - **注解驱动**:通过注解,开发者可以直接在Java类上定义服务接口和数据模型,简化了编码过程。 - **强大的调试功能**:CXF提供了...
10. **性能优化**:CXF支持多种传输协议和数据绑定机制,如HTTP、HTTPS、MTOM(Message Transmission Optimization Mechanism)和SwA(Swapped Attachments),这使得服务可以针对不同的场景进行优化,提高性能。...
6. **MTOM/XOP**:CXF支持MTOM(Message Transmission Optimization Mechanism)和XOP(XML-binary Optimized Packaging),用于高效传输二进制数据。 7. **WS-*支持**:CXF实现了多种WS-*规范,如WS-Security、WS-...
3. **多种协议支持**:除了基本的SOAP协议,CXF还支持RESTful风格的服务,以及诸如MTOM(Message Transmission Optimization Mechanism)和SwA(Swapped Attachments)这样的高级特性,用于优化大文件传输。...
- **MTOM/XOP**:CXF支持Binary Attachments for XML(MTOM)和XML Inline Binary Data(XOP),优化了大型二进制数据的传输。 - **安全性**:CXF提供了对WS-Security和其他安全标准的支持,如数字签名、加密等。 ...
【CXF WebService 开发指南】 CXF(Commons eXtensible Framework)是一个开源的Java框架,主要用于构建和开发Web服务。它提供了强大的服务实现和客户端调用能力,支持多种协议和规范,如JAX-WS、JAX-RS等。本指南...
在描述中提到,"cxf框架 webservice 生成客户端工具很好使用",这表明Apache CXF在构建客户端时表现得相当友好。要创建一个CXF客户端,你首先需要获取服务的WSDL URL,然后使用CXF的wsdl2java工具将WSDL转换为Java...
- MTOM文件传输:MTOM(Message Transmission Optimization Mechanism)是一种优化SOAP消息中大型附件传输的技术。 - Jax-Rs异步调用:支持异步方式调用WebService,提高应用性能和用户体验。 - Cxf拦截器特征...
5. **MTOM/XOP**:CXF支持高效传输大型二进制数据,通过MTOM(Message Transmission Optimization Mechanism)和XOP(XML-binary Optimized Packaging)技术。 6. **拦截器和终结点**:CXF的拦截器机制允许在服务...
### JAVA的WebService支持-CXF #### 一、概述与背景 WebService作为一种标准的服务技术,它允许不同系统之间通过网络进行通信。随着企业级应用对于跨系统、跨平台交互的需求日益增长,WebService因其开放性及标准...
标题中的"axis2-1.8.0apache-cxf-3.4.4.rar"是一个压缩包文件,其中包含了两个重要的开源项目:Apache Axis2版本1.8.0和Apache CXF版本3.4.4。这两个项目都是用于构建和部署Web服务的重要工具,主要应用于Java开发...
4. **MTOM(Message Transmission Optimization Mechanism)和SWA(Simple Object Access Protocol Attachment Profile)**:这些特性提高了传输大数据(如图像或文件)的效率。 5. **安全功能**:CXF支持多种安全...
5. **MTOM/XOP**:CXF支持Message Transmission Optimization Mechanism (MTOM) 和XOP (XML-binary Optimized Packaging),这对于处理大型二进制数据(如图片或文件)非常有用,可以显著减少网络传输的数据量。...
如果需要额外的功能,比如安全、MTOM(消息传输优化机制)、WSDL(Web服务描述语言)第一类支持等,需要自行添加对应的CXF扩展库。 总结来说,使用Apache CXF发布Web服务,需要确保具备基础的CXF库、JAX-WS支持、...
2. **CXF框架**:提供更多功能和扩展性,如WS-Security、MTOM/XOP等,对于大型项目或有特定需求的Web服务更有优势。同时,CXF提供了更好的调试工具和更强的错误处理机制。 总结,JDK原生方式适合初学者或小型项目,...