本文档是描述Smooks的应用状况,以及使用Jaxb替换smooks的可行性分析及实施方案,有不足之处还望谅解和指出。 html
项目系统中使用Smooks出现几回死锁问题致使系统宕机,其后针对Smooks进行性能测试,同时,与jaxb进行了对比,发现Smooks存在严重的性能瓶颈的问题。 java
20个用户并发操做的测试数据: 编程
50个用户并发操做的测试数据: api
最终结果: 数组
一、smooks各项指标都低于jaxb 安全
二、jaxb的吞吐量变化不大,但平均处理时长多了4秒,比较稳定。 并发
注:测试过程当中包含了读取报文的时间(即从文件中获取报文数据,然后经过XMLBind技术进行转换),虽然时间有所误差,可是,不影响总体测试结果。 app
目前,有关smooks的技术框架的使用,集中在VOS系统的销售服务层,也就是vos-app-sale-service。 框架
以下图所示: 高并发
若是使用其余技术好比Jaxb进行替换Smooks,能够在此层能够完成便可实现。其中,vos-app-sale-service层提供了每一个javabean与xml进行提供了可输入的报文,使操做更加透明。
Smooks因为它仅支持String的java引用类型对象,在咱们vos当中使用与xml进行绑定的Javabean的属性都是为java.lang.String,同时,每一个属性的值(String类型)都不能为null,必需要一个默认空字符"",这样转换过程当中才不会报错。这个局限是由于Smooks自己问题而存在的,而VOS系统把这个做为了开发规范,采用默认字符串进行属性数据与XML绑定了。
示例代码:
在这点来讲,Jaxb相对比较灵活点。
一、Jaxb支持基本数据类型
二、支持对引用类型向基本数据类型正反的转换好比java.util.Date,此功能须要配置jaxb的适配器完成的。
三、Jaxb对引用类型的对象(包括了String),若是属性是引用类型,那么若是为null状况,Jaxb是不会把该字段与XML进行绑定的,就是说在XML里面看不到该字段。
对咱们来讲,第三点是争议比较多的,不一样场景取决于不一样的用法,怎么使用须要根据实际状况来判进行决策选择。但事实上,咱们VOS中对javabean与xml转换若是字段属性出现null状况,默认须要在xml打印改字段的,这个前提条件是字段类型是String。
如上图示,划红线区域的是vos有关smook的config文件管理路径。
Smooks对javabean与xml互转的提供了最基本转换的同时,也支持动态的转换方式,主要体现config文件可使用模板引擎技术freemaket。
VOS中对smooks的动态支持是采用freemaket对其config进行处理完成的。
Jaxb对于动态支持是它薄弱的环节,从它自己来讲,Jaxb主要是经过注解来实现JavaBean与XML的转换。因此,对注解来讲,是须要编译然后没法改变的。固然也可使用一些第三方包经过改变class字节码来实现,但这个方案还没有获得普通应用,风险比较大。
Jaxb是静态的支持,Jaxb须要替换Smooks须要考虑这部分移植的可能性,是否能够经过其余途径来完成目的。答案是确定的,对于交换报文来讲,报文本是就是静态的,为了更好抽象咱们业务模型,支持动态报文,是基于重用的目的,可是,从单一职责和业务模型来讲,解耦是一个大问题,面向服务确定须要松耦合。
针对Smooks的应用状况,从集中式管理结构和数据类型应用来讲,Jaxb是实现替换Smooks是没有问题的。但考虑到Smooks的动态支持,须要耗费一些时间开来进行动态支持转换。从技术角度出发,是可行的。
必要考虑到风险分析:
一、其1、涉及到销售核心模块,任何差错均可能引发一些大的问题。
二、其2、涉及面广,虽然是集中,改动面积确实很大,config文件就有122个。
三、其3、技术要求更多,要求技术人员既要熟悉smooks,也要熟悉jaxb
四、其4、销售业务开发熟悉,不容易出错。
五、其5、须要测试人员进行回归测试。
Jaxb替换smooks具体实施过程,主要目标是下降风险,平滑化进行技术切换,可根据目前紧急程度,进行具体实施过程决策选择。
具体实施过程保障:
1、须要开发人员进行smooks与jaxb的技术培训。
2、提供jaxb相关的技术基础设施,好比转换工具类,数据类型适配器等。
3、兼容两种技术,一旦出现重大状况,须要进行回退。
具体实施建议参考:
1、以点到点就行操做,确保每一步修改都没有问题。
2、对存在比较严重问题区域优先处理。
若是人数充足支持下时间的状况下,能够进行大范围推土机方式进行处理,短期就能够出结果,风险高。
若是人数很少支持下时间足够的状况下,能够进行循环渐进方式进行处理,优先对主要的问题区域进行实施,这样操做的目的,将风险降到最低,可进可退,效率高。
JAXB(Java API for XML Binding),是一个业界的标准,提供了一个快速便捷的方式将Java对象与XML进行转换。
在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版本JAX-WS2.1,其底层支持就是JAXB。
JAXB 2.0 基于 JSR 175 编程注释工具定义的程序注释。
JAXB 2.0是JDK 1.6的组成部分。JAXB 2.2.3是JDK 1.7的组成部分。
若是使用JDK 1.5单独下载JAXB的RI便可,JAXB不支持JDK 1.4。
Jaxb官方地址:
JaveBean必须实现java.io.Serializable序列化接口,在头部地方必须注解@XmlRootElement。
实现对JaveBean转换成XML的实现过程。
public static String java2xml(Object obj) { try { JAXBContext content = JAXBContext.newInstance(obj.getClass()); Marshaller m = content.createMarshaller(); StringWriter sw = new StringWriter(); m.marshal(obj, sw); return sw.toString(); } catch (Exception e) { e.printStackTrace(); } return null; }
实现对XML转换成JaveBean的实现过程。
public static Object xml2java(String xml, Class clazz) { try { JAXBContext content = JAXBContext.newInstance(clazz); Unmarshaller m = content.createUnmarshaller(); StringReader sr = new StringReader(xml); Object t = m.unmarshal(sr); return t; } catch (Exception e) { e.printStackTrace(); } return null; }
Jaxb相关的重要的Class和Interfce。
参考文档:
是应用的入口,用于管理XML/Java绑定信息。
将Java对象序列化为XML数据。
将XML数据反序列化为Java对象。
Jaxb对List或者数组是须要手动处理,否则打印出来XML格式不是咱们须要的。
新增包含List的类:
在类对象中引用包含list的类属性:
Jaxb默认对Map进行处理,可能也不是咱们须要格式。
这个是带Map属性的JavaBean,可是最终结果展示不是咱们须要的。
若是学会了对象属性进行适配器处理就能够解决此类问题。
jaxb对java.uitl.Date进行处理,转换时间不是中文格式,由于java.util.Date的toString()默认是西方格式。这种风格不适合中国风,也很差认识。
下面是Date打印:
2011-09-01T00:00:00-03:00
而咱们须要的是
2011-09-01 00::00:03
这时候处理以下:
JavaBean的一些属性有时候是不须要对外进行xml绑定,这时候,咱们该怎么处理呢?在该字段前面进行注解@XmlTransient,表示不行对字段进行xml转换。
每每高并发系统对吞吐量要求比较要的,因此,不少XmlBind技术都必须针对不一样状况进行相应处理。而Jaxb当中, JAXBContext是属于线程安全的,可是Marshaller, Unmarshaller以及Validato都是非线程安全的。
针对JAXBContext属于线程安全的状况下,实现单例虽然有益于性能提升,可是高并发状况下,更容易出现问题。这种状况下,能够采起对象池来解决。