Posted on 2008-02-10 15:44
笨笨 閱讀(2491)
評論(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),配置框架會自動在該行后插入配置代碼. 這種方式的主要的問題是用戶理解困難,項目組支持的工作量大;不過這也是沒有辦法的辦法了.
總結
本文介紹了一種多文件操作配置框架的思路,并具體解釋類事務的配置動作實現過程, 該配置框架在項目實踐中達到了預期目的,收到不錯的效果.