posts - 4,  comments - 0,  trackbacks - 0

OpenAdaptor是为达到快速构建数据集成功能的适配器框架,用Java实现,抽象数据迁移的过程,用3类组

件完成数据迁移,通过对组件的连接和配置达到快速构建、高度复用的目的,快速地满足企业数据集成的

要求,具有标准化、快速开发、灵活、易于定制,高度复用特点。
OpenAdaptor原理
  在2个不同的业务数据库之间进行数据迁移的时候,经历三个过程:数据抽象,数据转换,数据加

载。OpenAdaptor框架将3个阶段抽象为3类不同的组件:sources,pipes,sinks,通过这3类内置的组件

分别完成各阶段工作。
在数据抽取阶段,对应sources组件,完成与源端的协议连接,读取数据并将数据转化为DataObject数组

,根据需要对数据加密/压缩;
数据转化阶段,对应pipes组件,完成数据过滤、数据转化、异常处理等作业;
数据加载对应sinks组件,完成建立与目的端的协议连接,将数据转化为目的端的数据格式,数据解压/解

密,将数据写入目的端。

source类型有3种:
callback类型是指数据到来时间触发source读取数据;
listen类型表示source监听数据,例如source从socket读数据。
poll类型表示每隔一段时间久读取数据。

在run()方法中不同类型的source分别调用runCallback()、runListen()、runPoll。

sourceProcess()方法对读取到的DataObject[]进行处理,并调用processMessage(),该方法会循环

调用管道线里下游组件的processMessage()。

AbstractWriter将DataObject[]转化为字符串的一个Writer类,如果sink制定了一个DoStringWriter,则

用改writer的实例根据DataObject[]产生字符串,否则产生默认的XML格式字符串。

OpenAdaptor采用的是Spring的技术,所以建议你在学习OpenAdaptor前,先学习Spring,至少要了

解Spring的AOP和IOC,知道Spring的工作原理,你就明白了一半OpenAdaptor的调用过程。
受限我们先看一个OpeanAdaptor的一个XML文件,为什么它要使用XML文件,而不是txt或者doc呢?这是因

为,XML文件是用来存储数据的,重在数据本身。而且她使用标签来存储数据,每个标签必须同时有结束

可开始标签。并且标签必须按照合适的顺序进行嵌套,这就使得它可以用来表示一些有层次的数据类型,

例如java中的类。还有一个重要原因是,Spring的特性(Service层,DAO层独立出现,在编码时既没有实

例化对象,也没有设置依赖关系,而把它交给Spring,由Spring在运行阶段实例化、组装对象)决定它必

须要使用到XML文件,在XML文件中配置各个组件。

首先,我们看一下OpenAdaptor的XML文件中的内容:
先看<beans>,yes,你很聪明,那是一个标准的Spring XML文件开头,好了这下你更确信了,所

谓OpenAdaptor不过是建立在Spring基础上的一个有特定功能的Java功能组件包。

好了,我们接着看,大家发现了么?LZ是个天才。

下面第一个组件式Adaptor 注意有很多Adaptor,这个是org.openadaptor.core.adaptor.Adaptor,那么我

们可以发现(当然LZ是在看了很多个XML文件后发现的),每个XML文件都有这个Adaptor,那么这

个Adaptor究竟是个神马东东?
  <bean id="Adaptor" class="org.openadaptor.core.adaptor.Adaptor">
    <property name="messageProcessor" ref="Router" />
  </bean>

  1。LZ发现这个Adaptor里面有个property属性,那么我们就想吧,什么里面有属性这一说,大家不知道

    学习Java有多深入,但是我可以告诉大家,属性绝对是个抽象的东西,因为具体的不叫属性,叫 值 

    。(⊙o⊙)哦!到这里你发现原来是这啊,那不就是个类吗?类里面有属性,当类生成具体对象 的  

  时候,可以给属性赋值,对头,LZ说。
     那么既然是属性,肯定有设置它的方法啊?楼主决定给这么问的童鞋奖励一个臭豆腐,属性如果不 

   能设置,就好比你只是说我有臭豆腐,可是没法吃。LZ郁闷。
     好,我们就打开这个类,看看谁掉泪。注意这个臭豆腐名叫messageProcessor。
     当当当当
       public void setMessageProcessor(final IMessageProcessor processor) {
    if (this.processor != null) {
      throw new RuntimeException("message processor has already been set");
    }
    this.processor = processor;
   
    /* if the processor has metrics treat them as 'global' Adaptor ones */
    if(processor instanceof IRecordableComponent){
      this.metrics = ((IRecordableComponent) processor).getMetrics();
      String enabled =  metrics.isMetricsEnabled() ? "on" : "off";
      log.info("Metrics are " + enabled);
    }
  }
  瓦擦
 这不是我编的。真的有这个嘞。好,如果你翻开看这个setMessageProcessor,行了,别吐。所 

   以我们不看丫的。那么我们知道就行了,它初始化的第一       

个Bean是org.openadaptor.core.adaptor.Adaptor,它的一个属性是messageProcessor,它……等等   

,有值,是的有值。值是多少?Router!Router?好的,Router是什么?我靠,Ruter是另外一   个Bean

,傻狗答道。
2。Router
介于傻狗同学的成就,我们今天请他作为特邀嘉宾,你好,傻狗!你好,楼猪!- -,啊,那个你向大家

介绍一下自己吧!(⊙_⊙),大家好,我是Router。大家 ⊙﹏⊙b汗

- <bean id="Router" class="org.openadaptor.core.router.Router">
- <property name="processors">
- <list>
  <ref bean="Servlet" />
  <ref bean="TickerFilter" />
  <ref bean="XMLConverter" />
  <ref bean="Validator" />
  <ref bean="Writer" />
  </list>
  </property>
  <property name="exceptionProcessor" ref="ExceptionHandler" />
  </bean>

哇,大家一阵狂吐!

 待续

 

posted on 2010-11-01 18:00 Vigoss 阅读(301) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(2)

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜