在axis2下使用jibx数据绑定(自allblue 的blog)

阅读更多

最近在百忙之中捣鼓了一些东西,一是第一次在Linux下远程安装了一次Oracle10g加上patch,这个其实好多人都做过,只不过对我来说还是第一次,而且结果还是非常顺利的,并不像人家所说的通常都会是一场恶梦。大部分时间都在看官方的安装手册,或许是之前估计到了可能会有麻烦,所以做了很多功课,这个以后有时间再加上。虽然没遇到什么特别的障碍,但是步骤的确蛮多的。

  今天用axis2下的jibx数据绑定,重新改写了一个旧有的项目,感觉不错。之前在axis2下用xmlbeans数据绑定做了一个小灵通的平台,那个项目是使用axis2的入门之作,不过使用下来,似乎稳定性和速度都有不错的表现。因此开始准备从axis开始迁移到axis2。

  axis2,二代一般总会比一代好吧。axis2也的确是这样,除去新标准的支持,架构的优化,光光是速度的提升和资源占用的减少,就足以吸引我去试用这个新平台了。其实在axis2出0.9x版本的时候,我曾经下载过一个版本,不过当时的版本根本无法解析我的wsdl,所以就没再深究下去。不过目前的1.1版本应该说已经是趋于生产的版本了。

  得以于axis2的新架构,写一个服务,会有很多种不同的方法,你即可以用pojo结合rpc模式来写,也可以用axis2自己的axiom api从底层写,也可以从wsdl生成相应框架,然后填写相应逻辑。

  对于wsdl生成框架代码这种形式,又有不同的数据绑定可以使用。axis2 1.1 可以使用adb(axis2自己的data binding)、xmlbeans、jibx、jaxme、jaxbri。其中常用的还是前两种,axis2官方是极力推荐自己的data binding的,因为速度快,架构相对简单,而且有一些独有的特性。xmlbeans,是对模式支持最好的data binding,一些特别复杂的模式只能在xmlbeans下才能正确生成框架代码。其他几种代码wsdl2java目前都不是支持得很好,都还在实验改进阶段。

  面对这么多数据绑定模式,很多人都无从选择。官方maillist上也有好多人问该用哪个。查了一些资料,据说,adb很好用,而且速度快,如果只是简单的模式,那么使用这种数据绑定就可以了。xmlbeans的强力模式支持,可以支持足够负责的模式,速度上也只是比adb低5%左右。而jibx很多人没用过,因为使用没有前两种方便,不过jibx支持unwrapping代码生成(普通代码生成的服务方法,一般只有一个参数,而unwrapping可以生成多个参数的方法,相当直观。)

  bindmark项目对目前的各种xml数据绑定工具做了一个大致的评测,jibx无论在大中小三种数据量情况下,都名列前茅(javolution也相当不错,而且该包不仅仅用于xml处理),这无疑加大了我的兴趣。

  axis2的wsdl2java工具对于adb以及xmlbeans支持都已经很好了,可以直接从wsdl2java生成相应的绑定类。不过jibx就相对复杂了,这和jibx的架构有一定的关系。jibx的速度快得益于它是一种xml pull模式的xml解析器,简单理解xml pull就是把xml解析推迟到实际对象使用的阶段,当使用xml某部分所对应的java对象时,解析器才开始真正的解析,这样就比传统的通篇解析的sax性能要好很多。jibx并不像其它的绑定框架,一般从XML模式出发,它用一个binding文件来联系一个XML实例和JAVA类。这样的好处是,我们可以使用自己类,而不是框架所生成的用户使用类。于是要用jibx做XML数据绑定,你就不仅仅只有目标XML就可以了,而且还要再准备一些JAVA类和目标XML类来对应。这说起来好像很拗口,因为XML数据绑定框架本来就是要用来生成JAVA类来对应XML的,怎么还要事先准备某些类呢。这一点对于没有读完jibx官方教程的人来说,的确很难理解。我们所要准备的JAVA类都是一些很简单的,几乎只有getter和setter方法的简单类,然后通过binding文件来指定这些JAVA类中的各个字段和XML中的对应关系。binding文件是一个简单的文本文件,有自己的语法。在准备好JAVA类和binding文件之后,用jibx的Binding Compiler编译binding,这个过程其实是jibx在我们准备的基础类中添加框架所需要的各种方法,使得最终得到符合jibx规范的可最终使用的XML绑定类。

  我是用的是axis2的1.1版本,虽然最后成功使用了jibx数据绑定,但还是无法使用最吸引人的jibx绑定的uw模式,可能1.1的版本对这种模式的支持还是很有限。我通过jibx官方的xsd2jibx根据我的xml模式来生成所需的java基础类,然后编写binding。(由于binding有自己的一套语法,就不再累述了)。有了两种基础素材,就可以把他们通过axis2提供的wsdl2java来生成axis2所需的绑定代码了。

@%AXIS2_HOME%/bin/wsdl2java -uri provision-3t.wsdl \
-p org.mllm.dsmp.axis2.client.jibx -d jibx \
-Ebindingfile E:\Work\webservice\dsmp\
\@axis2\org\mllm\dsmp\axis2\schemas\binding.xml \
-s -pn sgPort -o build/client

 

生成后就通过所生成的DsmpStub来进行相关的服务调用。其实如果不使用uw模式,代码本身和xmlbeans之类的不是相差很多,但是在速度方面就有所优势了,特别是在重复多次调用某个服务时,一次调用所节省的时间累积起来还是能节省不少时间的。

你可能感兴趣的:(Blog,XML,框架,WebService,Linux)