Posted on 2008-02-10 15:44
笨笨 阅读(2478)
评论(0) 编辑 收藏 所属分类:
Java
一个通用的文件配置框架
配置需求说明
在工作中,项目需要实现多种程序配置方式,每种程序配置均有各自的文件复制,变量替换(替换文本文件中的变量占位符),修改脚本文件的需求. 为减少重复代码,简化配置实现,我们实现了此配置框架.需求片断示例:
- 复制文件到某处
- 创建/append 某个 properties/txt 文本文件
- 修改脚本文件,插入一段文本到脚本文件某处
- 通过JMX/JNDI连接到远程应用服务器, 用Java code修改应用服务器的配置.
需求分析
从上述需求来看,第一印象就是用ANT或类ANT XML文件就可以很好的满足上述需求, 但是还需要做下面增强才会好用:
- 配置过程需要有类似于事务的机制,以保证多处改动的一致性.
- 各种配置过程之间有许多相同之处,为减少重复,可以考虑引入公共配置片断文件.
- 由于配置过程相对固定, 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>
- Action.performAction(): 实现正常配置动作,如果失败则返回错误码.
- Action.performCompensation(): 实现回滚动作,负责将配置对象(如文件内容)回滚到修改前的状态.
- Action.performComplete(): 实现正常配置完成动作, 负责释放配置过程占用的临时资源.
配置框架依次对每个要执行的动作调用performAction动作,如果当前Action返回失败错误码,则对已经成功执行的Action反向依次调用 performCompensation动作,执行回滚操作,从而保证配置过程的一致性; 如果全部成功,则依次调用performComplete操作,释放占用的临时资源,如下图:
为解决问题2,我们为每个action指定了一个index,用它规定执行顺序,配置框架从公共配置文件和私有配置文件中合并并排序所有的配置 action, 通过预先分配common action和private action的index范围, 每个单独的配置过程可以完全抽出重复配置动作.
为解决问题3, 每个action,每个变量定义(property 标记) 都可以有自己的condition 定义. 如此一来,配置文件的写法更类似于程序的执行过程,从开发角度也更加自然.
其它特性:脚本文件自动分析和插入配置行
应用服务器的启动脚本是用户可定制的,我们无法预见文件格式. 为解决这个问题,我们采用了如下方式:
- 对脚本进行语法分析,找出脚本的Java启动行(或Windows Service设置行),进而找出可用的shell变量和插入位置. 期望这种方式能够解决大多数用户自定义脚本.
- 对于复杂或分析条件不充分的脚本(如变量位于别的文件), 用户需要在合适位置插入一行有指定格式和参数的注释行(称之为anchor),配置框架会自动在该行后插入配置代码. 这种方式的主要的问题是用户理解困难,项目组支持的工作量大;不过这也是没有办法的办法了.
总结
本文介绍了一种多文件操作配置框架的思路,并具体解释类事务的配置动作实现过程, 该配置框架在项目实践中达到了预期目的,收到不错的效果.