sunloc

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

common-chain使用小记

前言

  在日常生活中,我们经常会碰到完成一件事情,需要分几个步骤来进行,比如一个春晚笑话“把大象装冰箱分几步的问题”;在我们程序实现功能的过程也常常如此,一个完整的功能通常可以分为几个独立的单元进行顺序执行来完成功能;apache的common-chain可以用来解决这种工作流式的执行工作问题。

基本对象

  首先来看看common-chain的基本对象

  Command:实现chain一个步骤时的具体指令;它是chain的基础。

  Chain:一个基础流程的定义,其中包含了一组顺序执行的Command对象;他也是继承至Command接口;ChainBase为其实现。

  Catalog:Chain的集合,其中对于每一个Chain都有一个名称作为唯一标示;CatalogBase为其实现。

  CatalogFactory:用于产出Catalog的工厂,包含一个默认的Catalog对象和一组以名称作为标示的Catalog对象组;CatalogFactoryBase为其实现。

  如图所示:

  还有一个比较重要的Context对象,他是用来进行Command命令执行过程中的上下文环境变量。Context它继承至Map对象,但是common-chain对于这个接口的实现比较巧妙,ContextBase是Context的实现,它将一个继承之的对象属性初始化到Map的k,v中,使得用户直接通过Map的put和get方法来设置和读取对象的属性值。

使用过程

  我们已经清楚common-chain的基本对象,接下来就是这么使用这些对象来让系统帮我们完成我们想要的功能了;想要让系统按照我们的想法一步一步地执行我们想要的功能,我们就需要一定的定义方式来让系统知道我们的执行流程,这种定义是通过xml的方式来实现的,默认的配置名称chain-config.xml,具体定义格式如下:

   command中className属性对应的类,即是我们根据Command接口实现的一个独立功能单元,execute接口返回false继续执行下一个command,true即停止。chain中的command对象,是根据className的类名通过反射的方式来实例化需要执行的command数组的。

  对于xml的解析,common-chain通过common-digester来解析的,使用digester来进行解析xml有一定的学习成本,它需要制定一个解析规则,看着比较晕。还有一个比较不错的xml解析框架castor,通过配置一个xml结构与类对象对应的xml文件,即可解析成相应的类对象了,看着比较直观。稍微扯远了一点。。。

  chain的定义完毕后,使用ConfigParser 来进行解析,解析完毕后通过CatalogFactoryBase来实例化一个Catalog然后获取其中的一个Chain,然后调用execute方法即可,代码如下:

   这样就完成了common-chain的基本使用过程。

 其他

common-chain提供了这些基本功能以外,它还内置实现了一些基本的Command命令:

CopyCommand:将Context中的FromKey的值复制给ToKey;

LookUpCommand:在CatalogFactory中查找是否含有指定名称的chain,有则执行之,没有就跳过;

RemoveCommand:将Context中FromKey去掉;

等。。。

 

posted on 2013-06-30 20:06  sunloc  阅读(1994)  评论(0)    收藏  举报