笨笨的思想片断

零碎片断,杂七杂八。
posts - 25, comments - 79, trackbacks - 0, articles - 0

一个通用的文件配置框架

Posted on 2008-02-10 15:44 笨笨 阅读(2476) 评论(0)  编辑  收藏 所属分类: Java

一个通用的文件配置框架


配置需求说明

在工作中,项目需要实现多种程序配置方式,每种程序配置均有各自的文件复制,变量替换(替换文本文件中的变量占位符),修改脚本文件的需求. 为减少重复代码,简化配置实现,我们实现了此配置框架.需求片断示例:
  1. 复制文件到某处
  2. 创建/append 某个 properties/txt 文本文件
  3. 修改脚本文件,插入一段文本到脚本文件某处
  4. 通过JMX/JNDI连接到远程应用服务器, 用Java code修改应用服务器的配置.

需求分析

从上述需求来看,第一印象就是用ANT或类ANT XML文件就可以很好的满足上述需求, 但是还需要做下面增强才会好用:
  1. 配置过程需要有类似于事务的机制,以保证多处改动的一致性.
  2. 各种配置过程之间有许多相同之处,为减少重复,可以考虑引入公共配置片断文件.
  3. 由于配置过程相对固定, ANT BUILD XML文件的多个target以及依赖关系检查就不需要了,但是需要更加灵活的条件判断机制来控制单个配置动作和变量赋值.

实现简介

根据上述分析,项目最终的XML配置文件格式如下:
<root>
    <common>
        <resource-bundle>ResourceBundle Message Class</resource-bundle>
        <variables>
            <!-- If contains CONFIG_XINFO ,copy it to PLATCODE -->
            <variable name="PLATCODE" value="${CONFIG_XINFO}">
                <condition>
                    <varexists name="CONFIG_XINFO" />
                </condition>
            </variable>
            <!-- Give it a default value -->
            <variable name="IS_WINDOWS" value="FALSE" />
            <variable name="IS_WINDOWS" value="TRUE">
                <condition>
                    <or>
                       <variable name="PLATCODE" value="windows"/>
                       <variable name="PLATCODE" value="windows64"/>
                    </or>
                </condition>
            </variable>
        </variables>
    </common>
    <configure>
        <action-invoke
            class="CustomizedActionClass"
            index="1"
        />
        <action-copy
            file="${Source File Variable}"
            dest="${Dest file Variable}"
            index="60"
            reason="Error Reason Key"
            />
        <action-write
            file="${File to Write}"
            index="20"
            reason="Error Reason Key"
        ><![CDATA[QUALDIR=${QUALDIR}
]]></action-write>
        <action-expand
            file="${File to be expanded}"
            index="30"
        />
    </configure>
</root>


与ANT BUILD XML相类似的,分为变量定义区域和配置动作定义区域. 为实现方便,变量可以被覆盖,变量赋值语句可以带条件.
具体配置过程由多个action-***规定,配置框架已经预提供标准动作: action-copy/action-write/action-expand 等等, action-invoke可以插入自定义Java代码.


为了解决问题1,配置框架实现了一套类似于两阶段提交的机制. 每个Action实现类需要实现三个方法:
  1. Action.performAction(): 实现正常配置动作,如果失败则返回错误码.
  2. Action.performCompensation(): 实现回滚动作,负责将配置对象(如文件内容)回滚到修改前的状态.
  3. Action.performComplete(): 实现正常配置完成动作, 负责释放配置过程占用的临时资源.
配置框架依次对每个要执行的动作调用performAction动作,如果当前Action返回失败错误码,则对已经成功执行的Action反向依次调用 performCompensation动作,执行回滚操作,从而保证配置过程的一致性; 如果全部成功,则依次调用performComplete操作,释放占用的临时资源,如下图:



为解决问题2,我们为每个action指定了一个index,用它规定执行顺序,配置框架从公共配置文件和私有配置文件中合并并排序所有的配置 action, 通过预先分配common action和private action的index范围, 每个单独的配置过程可以完全抽出重复配置动作.

为解决问题3, 每个action,每个变量定义(property 标记) 都可以有自己的condition 定义. 如此一来,配置文件的写法更类似于程序的执行过程,从开发角度也更加自然.


其它特性:脚本文件自动分析和插入配置行

应用服务器的启动脚本是用户可定制的,我们无法预见文件格式. 为解决这个问题,我们采用了如下方式:
  1. 对脚本进行语法分析,找出脚本的Java启动行(或Windows Service设置行),进而找出可用的shell变量和插入位置. 期望这种方式能够解决大多数用户自定义脚本.
  2. 对于复杂或分析条件不充分的脚本(如变量位于别的文件), 用户需要在合适位置插入一行有指定格式和参数的注释行(称之为anchor),配置框架会自动在该行后插入配置代码. 这种方式的主要的问题是用户理解困难,项目组支持的工作量大;不过这也是没有办法的办法了.

总结

本文介绍了一种多文件操作配置框架的思路,并具体解释类事务的配置动作实现过程, 该配置框架在项目实践中达到了预期目的,收到不错的效果.


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


网站导航: