概览
Smooks是一个开源的Java框架,用于处理“数据事件流”。它常常被认为是一个转换框架并以此被用于好几个产品和项目中,包括JBoss ESB(以及其它ESB)。然而究其核心,Smooks未提及“转换”或者其它相关的词汇。它的应用远不只这一点!
Smooks的工作是将结构化/层次化的数据流转变成“事件”流,然后交与“访问者逻辑(Visitor Logic)”进行分析,生成结果(可选的)。
源 ->结构化事件流(访问者逻辑) ->结果
那么,有哪些工作是这个工具可以完成,而sax和dom等工具不能完成的呢?鉴于Smooks构建于这些技术之上,所以简单的回答是“没有”。Smooks真正的价值在于能更方便地消费SAX和DOM(Smooks现在还不支持基于StAX的过滤器)。它提供了一个访问者API,以及一个配置模型,允许你轻易地将访问者逻辑的目标设定为具体的SAX事件(如果使用的是SAX过滤器)或DOM元素(如果使用的是DOM过滤器)。Smooks同时还以一种标准方式简化了对非XML源数据格式(EDI,CSV,JSON,Java等等)的消费,即由数据源产生的标准事件流变成了所有这些不同源数据格式的事实上的规范形式。这正是Smooks工作的关键!
使用Smooks的方式有两种,你可以使用其中之一或结合使用它们:
模式一:你可以完全投入到Smooks中,编写你自己的定制访问者逻辑事件处理器,将其用于处理一个数据源事件流中特定事件。使用这一模式,你必须熟悉核心的API。
模式二:你可以重用由Smooks发行版提供的开箱即用解决方案,其数目正在不断的增长中。在这种模式下,你只需要重用别人创建的组件即可,重新配置它们来处理你的数据源,例如,通过配置一些参数就可以由EDI数据源生成Java对象模型。
在这篇文章中,我们会快速地浏览一遍Smooks v1.1发行版提供的一些开箱即用的功能,即那些你不需要编写任何代码就可加以利用的功能(即模式二)。这包括:
多源数据格式:“轻易”地消费诸多流行的数据格式,包括XML,EDI,CSV,JSON和Java(是的,你可以以一种声明性的方式完成java到java的转换)。
转换:利用诸多选项消费由数据源产生的事件流,产生其它格式的结果(即,对源进行“转换”)。这包括能在过滤源数据流时对Smooks所捕获的数据模型应用FreeMarker和XSL模板。鉴于这些模板资源能被运用于源数据事件流内部的事件,因此它们能被用来执行“基于片断的转换(fragment based transforms)”。这意味着Smooks能被用于对数据源的片断执行转换,而不仅限于将数据源作为一个整体来施行转换。
Java绑定:以一种标准方式由所支持的数据格式(即不仅限于XML)创建和生成Java对象模型/图。由EDI数据源 生成某对象模型的配置与由XML数据源或JSON数据源生成对象模型所进行的配置几乎一模一样。唯一区别在于绑定配置的“事件选择器(event selector)”取值不同。
大型消息处理:Smooks支持多种处理大型消息(GBs)的方式,它是通过基于SAX的过滤器完成的。由于综合了 基于片断转换、Java绑定,以及使用节点模型混合DOM和SAX模型所带来的能力,Smooks可以使用较低的内存空间处理大型消息。这些能力允许你执 行直接的1对1转换,同时也支持对大型消息数据流执行1对多的分解、转换和路由。
消息修饰:使用数据库数据修饰消息。这可以按片断来完成,即你可以按片断来管理在一个片断上的修饰。与此相关的一个用例是一个包含了消费者ID列表的消息在发往另一个流程前需要从数据库提取消费者地址和概要数据来丰富。
基于可扩展XSD的配置模型:从Smooks v1.1开始,你可以用自己的可重用定制访问者逻辑配置模型来扩展Smooks XSD配置名字空间。创建这些定制配置扩展只是一项简单的配置工作,这个工作极大的增进了这些重用组件的可用性。所有的现有Smooks预置组件都利用了这一工具。